自定義view 開始 簡單的寫個TextView

隨着要求增多,原生態的控件有時候已經不能知足需求了,如今就開始簡單學習自定義控件,先自定義一個TextViewjava

首先,定義一個類繼承 View類,以下寫android

public class MyView extends View{
 }

由於父類已經定義了一個有參的構造函數,此時編譯器不會爲你調用默認的構造函數,canvas

當子類繼承時,必須在本身的構造函數顯式調用父類的構造函數,本身才能確保子類在初始化前父類會被實例化app

若是你父類中有無參的構造函數,子類就不會強制要求調用,即你寫的那個就能夠經過,編譯器會默認幫你調用父類的構造函數。ide

那咱們就默認第一個繼承父類的Context函數

public class MyView extends View{
    public MyView(Context context) {
       super(context);
    }
}

如今佈局MyView有了,怎麼顯示出來呢?固然直接new一個出來了佈局

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main); //這是默認佈局
    //改爲咱們定義的佈局 new一個出來
    setContentView(new MyView(this));
}

運行後學習

發現一個空白布局,咱們自定義的第一個控件已經成功了,不過太空白好像很差,加點色彩吧,繼承系統的繪畫方法,加點綠色而後畫個圓,如今重寫MyView字體

public class MyView extends View{

    private Paint mPaint;// 畫筆
    
    public MyView(Context context) {
       super(context);
       // TODO Auto-generated constructor stub
       initPaint();
    }
        
    @Override
    protected void onDraw(Canvas canvas) {
    	super.onDraw(canvas);
    	canvas.drawColor(Color.GREEN);    //畫布設爲綠色	
    	//畫筆 畫了一個圓
    	canvas.drawCircle(MeasureUtil.getScreenSize((Activity) mContext)[0] / 2, MeasureUtil.getScreenSize((Activity) mContext)[1] / 2, 200, mPaint);
    }
    
    /**
    * 初始化畫筆
    */
    private void initPaint() {
	// 實例化畫筆並打開抗鋸齒
	mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

	/*
	* 設置畫筆樣式爲描邊,圓環嘛……固然不能填充否則就麼意思了
	* 
	* 畫筆樣式分三種: 
	* 1.Paint.Style.STROKE:描邊 
	* 2.Paint.Style.FILL_AND_STROKE:描邊並填充
	 * 3.Paint.Style.FILL:填充
	*/
	mPaint.setStyle(Paint.Style.FILL);

	// 設置畫筆顏色爲自定義顏色
	mPaint.setColor(Color.argb(255, 255, 128, 103));

	/*
	 * 設置描邊的粗細,單位:像素px 注意:當setStrokeWidth(0)的時候描邊寬度並不爲0而是隻佔一個像素
	*/
	mPaint.setStrokeWidth(10);
    }
}

public final static class MeasureUtil {
    /**
    * 獲取屏幕尺寸
    */
    public static int[] getScreenSize(Activity activity) {
	DisplayMetrics metrics = new DisplayMetrics();
	activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
	return new int[] { metrics.widthPixels, metrics.heightPixels };
    }
}

如今從新運行一下this

好了,手動建立第一個view成功了,但是這個view是佔滿整個屏幕的,並且在xml中使用會報錯,如何編寫一個能夠自定義大小的而且能夠在xml中使用的view呢?還記得View父類提供了3個構造函數,沒錯第二就提供了控件大小的屬性 AttributeSet attrs控件屬性 咱們就重寫MyView,實現能夠自定義大小

public class MyView extends View{
    
    //實現 能夠設置自定義佈局大小
    public MyView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
    
    @Override
    protected void onDraw(Canvas canvas) {
    	// TODO Auto-generated method stub
    	super.onDraw(canvas);
    	canvas.drawColor(Color.GREEN);
    }
 
}

activity_main的xml佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.MyView
        android:layout_width="match_parent"
        android:layout_height="80dp"
        />
</RelativeLayout>

從新運行

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 
}

成功了高度80,如今加上一些別的屬性 作個TextView吧。

public class MyView extends View{

    private Paint mPaint;// 畫筆
    private String text; //顯示文字	
    private float textSize; //文字字體大小
    private int textColor;   //文字字體顏色
    private int backColor;    //背景顏色
    
    public MyView(Context context, AttributeSet attrs) {
       super(context,attrs);
       //得到 資源佈局得到數據
       TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyView);
       textColor = array.getColor(R.styleable.MyView_textColor, 0XFF00FF00); //提供默認值,放置未指定  
       textSize = array.getDimension(R.styleable.MyView_textSize, 36);  
       text = (String) array.getText(R.styleable.MyView_text);
       backColor = array.getColor(R.styleable.MyView_backgroudColor, 0XFF00FF00);
       array.recycle(); //要釋放
       initPaint();
    }
        
    @Override
    protected void onDraw(Canvas canvas) {
    	super.onDraw(canvas);
    	canvas.drawColor(backColor);    //背景
    	//顯示文字
    	canvas.drawText(text, 10, 110, mPaint);  
    }
    
    private void initPaint() {
	mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
	mPaint.setStyle(Paint.Style.FILL);
	mPaint.setColor(textColor);
	mPaint.setTextSize(textSize);
	mPaint.setStrokeWidth(10);
    }
}

屬性配置文件 attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <declare-styleable name="MyView">
        <attr name="textSize" format="dimension" />
        <attr name="textColor" format="color" />
        <attr name="backgroudColor" format="color" />
        <attr name="text" format="string" />
    </declare-styleable>   
</resources>

主佈局

xmlns:app1="  //註冊本身寫的屬性值
<com.myview.MyView
    android:id="@+id/vi"
    app1:text="hello"
    app1:textSize="20sp"
    app1:textColor="#0000ff"
    app1:backgroudColor="#ffff00"
    android:layout_width="100dp"
    android:layout_height="150dp"
/>

 好了本身寫的TextView已經成功了

下載地址 http://download.csdn.net/detail/qisil/8440363

相關文章
相關標籤/搜索