自定义view onMeaure

来源:互联网 发布:下载漫画的软件 编辑:程序博客网 时间:2024/06/04 23:19

自定义view onMeaure

记录一下今天的学习,看的很多,但是太过鱼龙混杂,也在这里写一下我对这个的理解

  • 自定view:通过继承view或者系统控件,实现更多的拓展功能。
  • 一个完整的自定义view需要实现onMeaure,onLayout,onDraw方法,正如我们所想的,当我们需要绘制一个view时候,首先需要对其进行测量大小,确定其大小,用到onMeaure,当大小确定过后,这个控件如何摆放,就需要调用onLayout,最后再对其进行onDraw方法。

    onMeaure方法

    在 onMeaure的父类方法中,已经有写好的方法,直接通过super调用就可以

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)      {          super.onMeasure(widthMeasureSpec, heightMeasureSpec);      }  

其中传入了widthMeasureSpec和widthMeasureSpec,说到这里就需要了解一下MeasureSpec类,MeasureSpec是sdk提供的用来存储控件的size和mode的类,我们可以直接用如下代码进行调用

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);      int widthSize = MeasureSpec.getSize(widthMeasureSpec);      int heightMode = MeasureSpec.getMode(heightMeasureSpec);      int heightSize = MeasureSpec.getSize(heightMeasureSpec);  

那我们得到这个有什么用呢,
MeasureSpec的specMode一共有三种类型,
EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用

当在布局文件中指定了确定的值时候,他的类型就是EXACTLY即确定的,这时候也可根据需要对其进行更改。
当在布局文件中指定为WARP_CONTENT时候,将会默认的根据父类的宽度和高度来进行测量,所以我们需要对其进行测量,得到我们需要的结果,如TextView,当指定为WARP_CONTENT时候将会对其进行判断,从而仅仅规划出适合字体那样的大小来进行显示。

当得到了这些值过后,就可以根据自己的需要通过 setMeasuredDimension(width, height)中传入width,和height进行相关的计算操作。