精华内容
参与话题
问答
  • onMeasure

    2015-12-11 15:07:41
    View在屏幕上显示出来要先经过measure(计算)和layout(布局).1、什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——...

    转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html
    View在屏幕上显示出来要先经过measure(计算)和layout(布局).

    1、什么时候调用onMeasure方法?
    当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.
    这两个参数指明控件可获得的空间以及关于这个空间描述的元数据.
    更好的方法是你传递View的高度和宽度到setMeasuredDimension方法里,这样可以直接告诉父控件,需要多大地方放置子控件.

      接下来的代码片段给出了如何重写onMeasure.注意,调用的本地空方法是来计算高度和宽度的.它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值.
    java代码:
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int measuredHeight = measureHeight(heightMeasureSpec);
    int measuredWidth = measureWidth(widthMeasureSpec);
    setMeasuredDimension(measuredHeight, measuredWidth);
    }

    private int measureHeight(int measureSpec) {

    // Return measured widget height.
    }

    private int measureWidth(int measureSpec) {

    // Return measured widget width.
    }
    边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:

    java代码:
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    依据specMode的值,(MeasureSpec有3种模式分别是UNSPECIFIED, EXACTLY和AT_MOST)
    如果是AT_MOST,specSize 代表的是最大可获得的空间;
    如果是EXACTLY,specSize 代表的是精确的尺寸;
    如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
    2、那么这些模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢?
    经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子 view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。
    而当设置为 wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY, 而MeasureSpec的UNSPECIFIED模式目前还没有发现在什么情况下使用。
    View的onMeasure方法默认行为是当模式为UNSPECIFIED时,设置尺寸为mMinWidth(通常为0)或者背景drawable的最小尺寸,当模式为EXACTLY或者AT_MOST时,尺寸设置为传入的MeasureSpec的大小。
    有个观念需要纠正的是,fill_parent应该是子view会占据剩下容器的空间,而不会覆盖前面已布局好的其他view空间,当然后面布局子 view就没有空间给分配了,所以fill_parent属性对布局顺序很重要。以前所想的是把所有容器的空间都占满了,难怪google在2.2版本里把fill_parent的名字改为match_parent.

      在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。
      接下来的框架代码给出了处理View测量的典型实现:

    java代码:
    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int measuredHeight = measureHeight(heightMeasureSpec);

    int measuredWidth = measureWidth(widthMeasureSpec);

    setMeasuredDimension(measuredHeight, measuredWidth);

    }

    private int measureHeight(int measureSpec) {

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

    // Default size if no limits are specified.

    int result = 500;
    if (specMode == MeasureSpec.AT_MOST){

    // Calculate the ideal size of your
    // control within this maximum size.
    // If your control fills the available
    // space return the outer bound.

    result = specSize;
    }
    else if (specMode == MeasureSpec.EXACTLY){

    // If your control can fit within these bounds return that value.
    result = specSize;
    }

    return result;
    }

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

    // Default size if no limits are specified.
    int result = 500;
    if (specMode == MeasureSpec.AT_MOST){
    // Calculate the ideal size of your control
    // within this maximum size.
    // If your control fills the available space
    // return the outer bound.
    result = specSize;
    }

    else if (specMode == MeasureSpec.EXACTLY){
    // If your control can fit within these bounds return that value.

    result = specSize;
    }

    return result;
    }

    展开全文
  • onmeasure

    2016-04-26 20:04:00
    UNSPECIFIE :0 [0x0],未加规定的,表示没有给子view添加任何规定。 EXACTLY :1073741824 [0x40000000],精确的,表示父view为子view确定精确的尺寸。 AT_MOST : -2147483648 [0x80000000],子view可以在指定的尺寸...
    • UNSPECIFIE : 0 [0x0],未加规定的,表示没有给子view添加任何规定。
    • EXACTLY : 1073741824 [0x40000000],精确的,表示父view为子view确定精确的尺寸。
    • AT_MOST : -2147483648 [0x80000000],子view可以在指定的尺寸内尽量大。

    转载于:https://www.cnblogs.com/lianghe01/p/5436410.html

    展开全文
  • protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int originalWidth = MeasureSpec.getSize(widthMeasureSpec);//800 int calculatedHeight = originalWidth * aspectHeight / ...
  • Android onMeasure

    2018-01-17 11:14:38
    Android onMeasureimport android.content.Context; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; public class MyView extends View { ...

    Android onMeasure


    import android.content.Context;
    import android.graphics.Color;
    import android.support.annotation.Nullable;
    import android.util.AttributeSet;
    import android.view.View;
    
    public class MyView extends View {
        public MyView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            this.setBackgroundColor(Color.RED);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            //假设设置View的默认宽高最小为100。
            int width = measureWidth(100, widthMeasureSpec);
            int height = this.getDefaultSize(100, heightMeasureSpec);
    
            //设置最终测量结果。
            setMeasuredDimension(width, height);
        }
    
        private int measureWidth(int size, int measureSpec) {
            int result = size;
            int specMode = MeasureSpec.getMode(measureSpec);//解析出模式。
            int specSize = MeasureSpec.getSize(measureSpec);
    
            switch (specMode) {
                case MeasureSpec.UNSPECIFIED:
                    break;
    
                //设置了android:layout_width="wrap_content"
                case MeasureSpec.AT_MOST:
                    result = specSize;
                    break;
    
                //设置了android:layout_width="match_parent"或一个具体的dp/pix值。
                case MeasureSpec.EXACTLY:
                    result = size;
                    break;
            }
    
            return result;
        }
    }

    展开全文
  • t understand when exactly does onMeasure fire. From what I gather it should trigger on every render, yet I am having a case when I click on item, it changes state, which invokes render, but onMeasure ...
  • 就是一个简单的自定义view,想要通过传入一个简单的自定义类,根据这个类的大小自确定view自己的大小,可是不重写onMeasure的时候还会显示出来,重写了就什么都没有了,但是点击位置还是会触发这个自定义view的事件 ...
  • 覆写onMeasure例子

    热门讨论 2012-10-23 22:25:03
    Android 自定义view,覆写onMeasure例子
  • Onmeasure报空指针

    万次阅读 2015-11-12 16:57:32
    欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 ...

    ListView 和ScroolView同时使用计算高度时onmeasure报空指针的解决办法

    虽然android 的设计者始终认为ListView、GridView+ScroolView组合使用并不是一种比较好的实现方法。但是在我们开发过程中又会经常使用到这样的需求,特别是在适配小屏幕手机的时候又必须要用这种让人不接受的设计,下面就来说一下在计算ListView或者GridView的过程中会出现onmeasure空指针的问题。


    解决办法

    当我发现listItem.measure(0,0)报空指针异常的时候,第一反应是listItem报空指针,然而debug调试过后发现其不为null,这个时候就比较费解了。
    通过查看官方API和一些资料查找后发现了幕后的原因,其主要原因跟Linearlayout的机制有关,原因是因为只有Linearlayout重写了onmeasure这个方法,而android的其他的4种布局均没有重写onmeasure方法,想到这里,这个问题就不解自破了。既然要用到measure计算高度,那么我们就只能用Linearlayout布局了,所有解决这个问题的办法就是把你对应的适配器(adapter)里的其他布局改成Linearlayout就OK了。
    自从跟进了这个问题之后,我最近也在寻找新的方式取代这种ListView 和ScroolView同时使用的情况,研究出来后会第一时间分享给大家。希望这篇博客能帮助大家解决这个问题。

    总结

    把adapter中的布局改成Linearlayout即可。原因如上。

    PS:最新开始准备着手写博客,写的不好的地方望大家见谅。

    个人博客
    http://jackwaiting.com
    https://github.com/Jackwaiting
    http://www.zhihu.com/people/jackwaiting

    展开全文
  • 理解onMeasure

    万次阅读 2012-12-11 14:07:42
    Android系统调用onMeasure来定义view的大小,很长时间理解不是很透彻,今天花了些时间打日志来理解它。总结如下。  1. widthMeasureSpec和heightMeasureSpec这两个值是android:layout_width="200dp" android:...
  • onLayout onMeasure

    2018-06-23 00:00:00
    View的measure方法会调用自己的onMeasure方法。 View要在onMeasure中计算自己的大小,并将结果通过调用setMeasuredDimension(int width, int height)来保存结果。 同时也要调用子Vie...
  • onMeasure模式

    2018-06-06 17:30:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • onMeasure相关

    2016-08-23 18:12:10
    1、继承自View的自定义View为什么要重写onMeasure方法: View.java中的onMeasure方法如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(getDefaultSize...
  • Android OnMeasure

    2015-06-08 15:14:11
    http://stackoverflow.com/questions/13099652/custom-rotating-of-an-image-view ...onMeasure() is your opportunity to tell Android how big you want your custom view to be dependent the layo
  • onMeasure方法

    2014-05-29 11:42:09
    有两个对布局界面影响很的方法,onDraw(),和onMeasure(). onDraw()比较好理解.onMeasure()就比较难理解一些,也更复杂些 ,引用文档中的说法就是: onMeasure() is a little more involved. 其实还有另一个...
  • 关于onMeasure

    千次阅读 2010-08-21 13:10:00
    关于onMeasure 1、onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec 和heightMeasureSpec。它们指明控件可获得的空间以及...
  • android Onmeasure

    2014-05-10 11:17:32
    笔记- - android中 Onmeasure方法会在绘图前,也就是Ondraw()方法调用前调用,也就是Onmea

空空如也

1 2 3 4 5 ... 20
收藏数 4,924
精华内容 1,969
关键字:

onmeasure