能夠實現自定義UI是android開發很重要的一個階段,下面就和大傢一起學習、分享。首先官網上有兩篇文章:
1、Custom Components
2、Creating Custom Views
這兩篇文章不可錯過,是最靠譜的基礎文獻。總的來說,如果想完全定制,就繼承與於View類;如果隻是在原有控件基礎上拓展,那就繼承TextView、Button或者LinearLayout等。接下來,就以實例的形式,逐步掌握這方面的技能。
下面就自定義一個類,用來畫一個圓圈:
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Path.Direction; import android.util.AttributeSet; import android.view.View; public class GraphicsView extends View { //用於畫路徑、線條等 private Path circle; //畫筆 private Paint cPaint; public GraphicsView(Context context) { super(context); initView(); } public GraphicsView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub initView(); } public GraphicsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub initView(); } private void initView(){ circle = new Path(); //畫一個輪廓 circle.addCircle(150, 150, 100, Direction.CW); //設置畫筆 cPaint = new Paint(Paint.ANTI_ALIAS_FLAG); cPaint.setStyle(Paint.Style.STROKE); cPaint.setColor(Color.LTGRAY); cPaint.setStrokeWidth(3); //設置背景 setBackgroundResource(R.drawable.ic_launcher); } @Override public void draw(Canvas canvas) { // TODO Auto-generated method stub super.draw(canvas); canvas.drawPath(circle, cPaint); } }我們是繼承瞭View,並且實現瞭全部三個構造方法。在這個地方需要註意一下,如果你的view不是在xml中,而且也不打算使用什麼樣式,那麼就無需實現帶有AttributeSet attrs, int defStyleAttr這樣的構造方法,因為用不到樣式什麼的。比如在activity中就可以這樣使用:
import android.os.Bundle; import android.view.Menu; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new GraphicsView(context)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }但是,上面這個類已經實現瞭所有構造方法,那麼就可以在佈局文件裡使用瞭,如下:
對應的activity就是這樣:
import android.os.Bundle; import android.view.Menu; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }效果看起來就是這樣的: