1.自定義view的實(shí)現(xiàn)
因?yàn)锳ndroid系統(tǒng)內(nèi)置的view不能滿足我們的項(xiàng)目需求炫加,所以我們要定制自己的view绘梦。實(shí)現(xiàn)自定義view我們大部分的時(shí)候需要實(shí)現(xiàn)兩個(gè)方法:onMeasure()方法和onDraw()方法才避。其中onMeasure()方法是用來(lái)測(cè)量當(dāng)前view的大小,onDraw()方法是將view繪制出來(lái)。同時(shí)汰聋,我們的自定義view要實(shí)現(xiàn)三個(gè)構(gòu)造方法:
public MyView(Context context) {
super(context);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
1.1 onMeasure()方法
我們實(shí)現(xiàn)自定義view ,首先要測(cè)量寬高尺寸喊积。當(dāng)view類的默認(rèn)處理不能滿足我們的要求的時(shí)候烹困,我們要重寫onMeasure()方法.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
其中,widthMeasureSpec和heightMeasureSpec分別包含了寬高的尺寸以及測(cè)量模式乾吻。但是這時(shí)候有一個(gè)問(wèn)題:一個(gè)int型數(shù)據(jù)怎么能存放兩個(gè)信息?Google爸爸的實(shí)現(xiàn)方法是將int型的前兩個(gè)bit用來(lái)區(qū)分不同的測(cè)試模式髓梅,后30bit用來(lái)存放尺寸大小。并且Google爸爸提供一個(gè)內(nèi)置類:MeasureSpec來(lái)處理數(shù)據(jù)绎签。
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
那么枯饿,問(wèn)題又來(lái)了。既然我們可以通過(guò)內(nèi)置類(MeasureSpec)來(lái)獲取view的大小诡必,那我們?yōu)槭裁催€要拿到測(cè)量模式奢方?我們要注意,這里我們獲得的尺寸是父view提供給我們的參考的爸舒,并不是當(dāng)前view真正的尺寸大小蟋字。
測(cè)量模式有三種:
//獲取測(cè)量模式
int mode = MeasureSpec.getMode(measureSpec);
switch(mode){
//父容器沒有對(duì)當(dāng)前view有任何限制,當(dāng)前view可以取任意值
case MeasureSpec.UNSPECIFIED:
break;
//當(dāng)前的尺寸就是當(dāng)前view應(yīng)該設(shè)置的尺寸
case MeasureSpec.EXACTLY:
break;
//當(dāng)前尺寸是當(dāng)前view能取到的最大尺寸
case MeasureSpec.AT_MOST:
break;
}
1.2 onDraw()方法
onMeasure()方法用來(lái)實(shí)現(xiàn)自定義寸尺扭勉,那么onDraw()就是用來(lái)繪制我們的view鹊奖。我們可以繪制不同類型的view來(lái)滿足我們的需求。下面來(lái)繪制一個(gè)圓形:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//獲取圓的半徑剖效,因?yàn)槲覀兊膙iew的寬高是一樣嫉入,所以getMeasureHeight也是可以的
int r = getMeasuredWidth()/2;
Log.e(TAG, "onDraw: r" + r );
//獲取圓心的X坐標(biāo)
int centerX = getLeft()+r;
Log.e(TAG, "onDraw: getLeft " + getLeft() );
//獲取圓心的坐標(biāo)
int centerY = getTop()+r;
Log.e(TAG, "onDraw: getTop " + getTop() );
//創(chuàng)建一個(gè)畫筆
Paint paint = new Paint();
paint.setColor(Color.RED);
//畫圓形
canvas.drawCircle(centerX,centerY,r,paint);
}
效果圖
注:
該文章引用自huachao1001的文章 ,這是去往該作者的鏈接.