• 自定义View中的onMeasure()方法


    自定义View中的onMeasure()方法

    在自定义 View 的时候,需要实现 onMeasure() 方法,去告诉系统这个自定义 View 的大小。

    onMeasure() 方法如下:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    }
    

    测量模式

    通过 MeasureSpec 类解析 widthMeasureSpecheightMeasureSpec 帮助测量 View。
    MeasureSpec 是一个32位的 int 值,其中高2位为测量的模式,低30位为测量的大小。

    测量模式可以分为以下三种

    • EXACTLY

    layout_width 或 layout_height 为具体数值,比如 android:layout_width="100dp",那么宽度的测量模式就是 EXACTLY。
    还有,如果 layout_width 或 layout_height 为 match_parent 时,也是 EXACTLY 模式。

    • AT_MOST

    layout_width 或 layout_height 为 wrap_content 时

    • UNSPECIFIED

    想要多大就多大。

    如何自定义测量值

    首先,得到测量模式和测量值

    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);
    

    当测量模式为 EXACTLY 时,直接使用 specSize 即可;
    当测量模式为 AT_MOST 时,去除我们制定的大小与 specSize 中的最小是来作为最后的测量值;
    当测量模式为 UNSPECIFIED 时,直接使用我们制定的大小。

    private int measureWidth(int measureSpec) {
    	int result;
    
    	int specMode = MeasureSpec.getMode(measureSpec);
    	int specSize = MeasureSpec.getSize(measureSpec);
    	
    	if (specMode == MeasureSpec.EXACTLY) {
    		result = specSize;
    	} else {
    		result = 200;
    		
    		if (specMode == MeasureSpec.AT_MOST) {
    			result = Math.min(result, specSize);
    		}
    	}
    	
    	return result;
    }
    

    如果不重写 onMeasure 方法

    如果在自定义控件的时候,不重写 onMeasure 方法的话,就只能使用 EXACTLY,也就是 layout_width 和 layout_height 只能使用具体数值或者 match_parent。

    注意

    测量完 View 的大小之后,别忘了调用

    setMeasureDimension();
    
  • 相关阅读:
    软件开发模式
    my parnter code review
    官僚模式和功能团队模式的优缺点
    思考题
    my code review
    四则运算
    Android Studio下使用Junit框架测试数组和
    SQL2008 存储过程 增删改查例子
    NET 无法显示XML页怎么办
    vs2010 2005 2008 代码前面出现··········取消方法
  • 原文地址:https://www.cnblogs.com/okadanana/p/5866770.html
Copyright © 2020-2023  润新知