自定義view需要重寫兩個函數:onMeasure() 和 onDraw()。
onMeasure()用來測量view的大小。
測量中的三種模式
EXACTLY 當我們爲view 精確的指定它的大小的時候,還有指定爲match_parent時會使用該模式
AT_MOST 當view屬性wrap_content的時候會使用這個模式
UNSPECIFIED 這種模式我暫時不知道什麼時候會被調用自己各種調用方式都試過都沒調用過,等以後遇到了補充進來
自定義view 默認支持EXACTLY 如果想讓它支持wrap_content屬性就要重寫onMeasure()。
自定義view 一定要有兩個構造函數:public Myview (Context context)()和public Myview ( Context context,AttributrSet attrs)
onDraw()就是用來進行繪製我們需要的效果的,用Canva 進行繪製。
樣例代碼:
public class MyView extends View { private int defaultSize; public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } private int getMySize(int defaultSize, int measureSpec) { int mySize = defaultSize; int mode = MeasureSpec.getMode(measureSpec); int size = MeasureSpec.getSize(measureSpec); switch (mode) { case MeasureSpec.UNSPECIFIED: { mySize = defaultSize; break; } case MeasureSpec.AT_MOST: {//如果測量模式是最大取值爲size //我們將大小取最大值,你也可以取其他值 mySize = size; break; } case MeasureSpec.EXACTLY: {//如果是固定的大小,那就不要去改變它 mySize = size; break; } } return mySize; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = getMySize(defaultSize, widthMeasureSpec);//分別調用getsize()進行測量計算 int height = getMySize(defaultSize, heightMeasureSpec); setMeasuredDimension(width, height);//一定記得添加值 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int r=getMeasuredHeight()/2; int conterX=getLeft()+r; int conterY=getTop()+r; Paint paint=new Paint(); paint.setColor(Color.GRAY); canvas.drawCircle(conterX,conterY,r,paint); } }注:這段代碼是繼承於view 不需要單獨創建xml,佈局寫在mainactivity的佈局文件中就可以
佈局代碼:
<LinearLayout 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" android:orientation="vertical" tools:context="com.example.zobject.myview.MainActivity"> <com.example.zobject.myview.MyView android:layout_width="wrap_content" android:layout_height="100px" android:background="#ff0000" /> </LinearLayout>注:自定義view一定要寫完整的包名。
效果圖
自定義view group 在後續複習中補充,還有canvas在後續中要寫一篇。