Android自定義UI

能夠實現自定義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;
	}

}

效果看起來就是這樣的:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *