概述
在Android中,我们经常会需要去绘制一些自己需要的控件,所以继承自View的自定义View就产生了。这篇文章主要介绍View中的几个重要方法及参数。
创建一个自定义View
首先我们先简单写一个自定义View,为了降低学习门槛这里仍使用java书写此示例
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
/**
* create by xu.tian
*
* @date 2021/8/22
*/
public class MyView extends View {
public static final String TAG = MyView.class.getSimpleName();
private Paint paint = new Paint();
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);
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
Log.d(TAG,"onDraw");
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
Log.d(TAG,"onMeasure");
Log.d(TAG,"width ---> "+MeasureSpec.getSize(widthMeasureSpec)+"\n"+
"height ---> "+MeasureSpec.getSize(heightMeasureSpec));
}
@Override
protected void onLayout(boolean changed , int left ,int top ,int right , int bottom){
super.onLayout(changed, left, top, right, bottom);
Log.d(TAG,"onLayout");
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w,h,oldw,oldh);
Log.d(TAG,"onSizeChanged width ---> "+w+"\n"+
"height ---> "+h+"\n"+
"oldw ---> "+oldw+"\n"+
"oldh ---> "+oldh);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Log.d(TAG,"onDetachedFromWindow");
}
}
上述简单的View没有进行任何绘制,运行后的日志输出如下
2021-08-22 13:00:45.415 27174-27174/com.tx.camera D/MyView: onMeasure
2021-08-22 13:00:45.415 27174-27174/com.tx.camera D/MyView: width ---> 1080
height ---> 2304
2021-08-22 13:00:45.423 27174-27174/com.tx.camera D/MyView: onMeasure
2021-08-22 13:00:45.423 27174-27174/com.tx.camera D/MyView: width ---> 1080
height ---> 2304
2021-08-22 13:00:45.424 27174-27174/com.tx.camera D/MyView: onSizeChanged width ---> 1080
height ---> 2304
oldw ---> 0
oldh ---> 0
2021-08-22 13:00:45.424 27174-27174/com.tx.camera D/MyView: onLayout
2021-08-22 13:00:45.434 27174-27174/com.tx.camera D/MyView: onDraw
可以明显的看到依次执行
onMeasure > onSizeChanged > onLayout > onDraw
关闭应用后,日志打印
2021-08-22 13:26:51.777 2491-2491/com.tx.camera D/MyView: onDetachedFromWindow
方法及参数说明
- onMeasure(int widthMeasureSpec, int heightMeasureSpec)
根据该方法主要在View测量完宽高后回调
- widthMeasureSpec 水平方向上的距离
- heightMeasureSpec 垂直方向上的距离
- onSizeChanged(int w, int h, int oldw, int oldh)
- w 当前水平方向的距离
- h 当前垂直方向的距离
- oldw 变化之前的水平方向的距离
- oldh 变化之前的垂直方向的距离
- onLayout(boolean changed , int left ,int top ,int right , int bottom)
当view在父控件中的位置测量固定后回调,参数分别为
- changed 位置是否为新位置,是否发生了变化
- left view的左边界
- top view的上边界
- right view的右边界
- bottom view的下边界
- onDraw
当view绘制自身内容后回调
- canvas 图层对象,用来绘制新的内容,在自定义的开发中,我们主要的绘制工作也在这里进行
- onDetachedFromWindow
当view被window移除时回调
总结
自定义View在绘制时主要进行了如下几步
- 测量本身的大小,完成后回调onMeasure方法,如果大小改变时还会回调onSizeChanged方法
- 测量在父控件中的位置,完成后回调onLayout方法
- 开始绘制自身内容,回调onDraw方法
- 离开界面时调用onDetachedFromWindow方法
-
在下篇文章我们开始介绍如何绘制简单的图形
网友评论