有时,Android系统控件无法满足我们的需求,因此有必要自定义View。

一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小,【protected voidonMeasure(int widthMeasureSpec, int heightMeasureSpec)】。

onMeasure传入的两个参数是由上一层控件传入的大小,有多种情况,重写该方法时需要计算控件的实际大小,然后调用setMeasuredDimension(int, int)设置实际大小。

onMeasure传入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸数值,而是将模式和尺寸组合在一起的数值,我们需要通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size =MeasureSpec.getSize(widthMeasureSpec)得到尺寸。

MeasureSpec由大小(size)和模式(model)组成,mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。

MeasureSpec.EXACTLY 是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip",或者为FILL_PARENT时,都是控件大小已经确定的情况,都是精确尺寸。

MeasureSpec.AT_MOST 是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可,因此此时的mode是AT_MOST,size给出了父控件允许的最大尺寸,子空间可以进行变大但不能超过最大尺寸。

MeasureSpec.UNSPECIFIED 是父layout不限制它子元素的大小,可以设置成任意大小,比如父容器为ScrollView。

更多相关文章

  1. Android(安卓)RecyclerView控件
  2. android常见手动和自动轮播图效果
  3. android:layout_above="@+id/XXX"与android:layout_below="@+id/
  4. ScrollView中的控件占据ScrollView的match_parent
  5. Android快速开发框架dyh详解(五)---基础层的使用
  6. 让android程序的屏幕分辨率大小可以支持平板电脑.
  7. Android(安卓)漂亮的日期选择控件Time-Selector
  8. Android之基本组件
  9. android viewflipper 左右滑动切换显示图片效果

随机推荐

  1. 不容错过!开发者必备的十二大Android开发
  2. android之使用Html5开发
  3. Android助力国产手机,诺基亚会否噩梦不断?
  4. 《Android移动应用基础教程》(Android Stu
  5. [Android算法] Android蓝牙开发浅谈
  6. android icon 设计
  7. android 依赖工程 Android 工程引用其他L
  8. Android(安卓)API Guides---Debugging We
  9. Android使用JNI实现Java与C之间传递数据
  10. android google 分屏 多窗口 按home键界