Android 自定义View:onSizeChanged、onDraw、onMeasure顺序

本文详细介绍了Android自定义View中onSizeChanged、onDraw、onMeasure方法的执行顺序及其作用。onSizeChanged在尺寸变化时调用,用于获取控件宽高;onMeasure负责测量View大小,可以通过setMeasuredDimension设定;onDraw则在最后进行视图绘制。示例代码展示了这些方法如何被调用及使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 自定义View:onSizeChanged、onDraw、onMeasure顺序

  • 示例代码
  • public class MyView extends View {
        private String TAG = "--------MyView";
        private int width, height;
        public MyView(Context context, AttributeSet attrs) {
            super(context, attrs);
            Log.i(TAG,"MyView()");
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            width = w;
            height = h;
            Log.i(TAG,"onSizeChanged()");
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Log.i(TAG,"onDraw()");
    
            Rect rect = new Rect(0, 0, width, height);
            Paint paint = new Paint();
            paint.setColor(Color.RED);
            canvas.drawRect(rect, paint);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            Log.i(TAG,"onMeasure()");
        }
        
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            Log.i(TAG,"onFinishInflate()");
        } } ```
    
  • 运行结果:
  • 03-15 01:28:53.111 30961-30961/com.myView I/--------MyView: MyView()
    03-15 01:28:53.111 30961-30961/com.myView I/--------MyView: onFinishInflate()
    03-15 01:28:53.210 30961-30961/com.myView I/--------MyView: onMeasure()
    03-15 01:28:53.210 30961-30961/com.myView I/--------MyView: onMeasure()
    03-15 01:28:53.520 30961-30961/com.myView I/--------MyView: onMeasure()
    03-15 01:28:53.520 30961-30961/com.myView I/--------MyView: onMeasure()
    03-15 01:28:53.520 30961-30961/com.myView I/--------MyView: onSizeChanged()
    03-15 01:28:53.543 30961-30961/com.myView I/--------MyView: onDraw()

1、MyView() 构造方法,这个不做解释,铁定第一个被调用。
作用:传入Context

2、onFinishInflate() 当View中所有的子控件均被映射成xml后触发

3、onMeasure() 在View放置到父容器时调用
作用:测量View的大小,也可以通过下面方式,修改View的大小

  •     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            //实现自己想要的组件,那么需要使用到setMeasuredDimension这个方法
            //这个方法决定了当前View的大小**
            setMeasuredDimension(100,100);
        } ```
    
    

也可以通过以下方式获取控件的宽和高

  •     @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int width = MeasureSpec.getSize(widthMeasureSpec);
           int height = MeasureSpec.getSize(heightMeasureSpec));
        } ```
    

4、onSizeChanged() 在控件大小发生改变时调用。所以这里初始化会被调用一次
作用:获取控件的宽和高度

5、onDraw() 最后就是绘制图形了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值