zoukankan      html  css  js  c++  java
  • 自定义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();
    
  • 相关阅读:
    SQLite数据库如何存储和读取二进制数据
    JS常用代码
    获取内容第一张图片地址的函数
    我对App_Code的理解
    VS2008中Web项目的App_Code目录问题
    jQuery 浮动广告实现代码
    常用的倒计时脚本
    IE8 CSS hack
    精典的网吧常用批处理收集
    ASP.NET中App_Code,App_Data等文件夹的作用
  • 原文地址:https://www.cnblogs.com/okadanana/p/5866770.html
Copyright © 2011-2022 走看看