隨着要求增多,原生態的控件有時候已經不能知足需求了,如今就開始簡單學習自定義控件,先自定義一個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已經成功了