安卓自定义view omMeasure通俗解析

作者: 杰克船长爱萝莉 | 来源:发表于2018-04-24 11:09 被阅读0次

在很多自定义view之后,控件的高度或者宽度需要自适应,即使使用wrap_content没有作用还是match_parent的效果,这时就需要重写onMeasure()方法来实现,view类的onMeasure()方法默认是只支持.EXACTLY模式,所以在自定义view先支持wrap_content就得重写onMeasure(),在这里就需要说一下测量的三种模式了:

第一种:

EXACTCLY

大概意思就是精确值模式,我们在布局文件中的宽和高为具体值,或为match_parent(父布局的大小)属性时系统会用次模式,
(也就是说 你再布局文件假设指定宽度和高度均为具体数值,那么后面重写方法的时候 就会用这个模式去测量,这么说你肯定没问题 能搞懂)
第二种:

AT_MOST

大概意思就是最大值模式,我理解为就是自适应。我们在布局文件中的宽和高为wrap_content 属性时,控件的大小一般会随着子View大小大或内容的多少的变化而变化,此控件只要不超过父控件的大小就行。
(也就是说 你再布局文件假设指定宽度和高度均为wrap_content,那么后面重写方法的时候 就会用这个模式去测量,这么说你肯定没问题 能搞懂)
第三种:

UNSPECIFIED

这种模式不指定测量模式,view大小没有限制,想多大就多大。

我们可以通过MeasureSpec这个类的getMode()和getSize()方法获取测量模式和大小,
(这个说法同上 一次类推,但是这个一般不咋用。像多大就多大 你咋不上天。。。)

/**
* view的大小控制
*/

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

    setMeasuredDimension(measureWidth(widthMeasureSpec),  
            measureHeight(heightMeasureSpec));  

}  

private int measureHeight(int measureSpec) {  
    int result = 0;  
    int mode = MeasureSpec.getMode(measureSpec);  
    int size = MeasureSpec.getSize(measureSpec);  

    if (mode == MeasureSpec.EXACTLY) {  
        result = size;  
    } else {  
        result=75;  
        if (mode == MeasureSpec.AT_MOST) {  
            result = Math.min(result, size);  
        }  
    }  
    return result;  

}  

private int measureWidth(int measureSpec) {  
    int result = 0;  
    int mode = MeasureSpec.getMode(measureSpec);  
    int size = MeasureSpec.getSize(measureSpec);  

    if (mode == MeasureSpec.EXACTLY) {  
        result = size;  
    } else {  
        result = 75;//根据自己的需要更改  
        if (mode == MeasureSpec.AT_MOST) {  
            result = Math.min(result, size);  
        }  
    }  
    return result;  

}  

result 你可以认为 是自适应模式下的最小数值。这下大家对这个onMeasure方法其实了解的差不多了吧,如果想知道里面的测量原理建议去关注郭霖郭大神的博客,里面有详细的介绍。哈塞给,我的剑就是你的贱。。。。。。。。。。

相关文章

  • 安卓自定义view omMeasure通俗解析

    在很多自定义view之后,控件的高度或者宽度需要自适应,即使使用wrap_content没有作用还是match_p...

  • 学习自定义View的一些文章

    安卓自定义View基础:坐标系 安卓自定义View基础:角度弧度 安卓自定义View基础:颜色 Android自定...

  • 安卓自定义View教程-1

    基础篇 安卓自定义View基础 - 坐标系 安卓自定义View基础 - 角度弧度 安卓自定义View基础 - 颜色...

  • [转]自定义View的学习

    原文连接 如何关闭硬件加速 自定义View 基础篇 安卓自定义View基础 - 坐标系 安卓自定义View基础 -...

  • 自定义View教程目录

    参考安卓自定义View教程目录

  • 安卓画笔setShadowLayer与SetMaskFilter

    安卓自定义 View 踩坑笔记,特作文记录 安卓 Paint 类用于自定义 View 时↑这两个方法能用来干嘛我就...

  • Android View的滑动方式

    自定义View是安卓进阶的基础,是安卓开发者不得不学习的知识点,而酷炫的自定义View效果也是离不开View的滑动...

  • Android Touch System(一)

    前言 之前写了一篇文章是关于自定义控件的。在学习自定义view的时候顺便把安卓的touch system(安卓触摸...

  • android开发之简单的自定义view

    自定义view是安卓开发进阶中的重要阶段。所以想在这方面多花些时间看看,写写。 自定义view的步骤: 1、自定义...

  • 自定义View之组合View

    前言 自定义View是安卓开发中比较重要的一环,很多地方都需要用到自定义View。而自定义View比较常见的一种形...

网友评论

    本文标题:安卓自定义view omMeasure通俗解析

    本文链接:https://www.haomeiwen.com/subject/jqwdlftx.html