打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android 自定义View 中的OnMeasure的用法

2014年06月12日 12:43:13 cug_liuyatao

  1. 作用:根据父容器传递跟子容器的大小要求来确定子容器的大小。

  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)的参数说明和MeasureSpec类的说明:

通过MeasureSpec这个类可以获取父View传递过来的一些信息,包括MODE、SIZE属性。这里做一下说明

    • 当MODE为AT_MOST时,SIZE大小为父容器所能提供的最大值。

    • 当MODE为EXACTLY时,SIZE为父容器提供的限制值。

    • 当MODE为UNSPECIFIED时,大小为0,SIZE完全由子容器的大小决定。

    • AT_MOST:子容器可以是声明大小内的任意大小

    • EXACTLY:父容器已经为子容器确定的大小,子容器应该遵守

    • UNSPECIFIED:父容器对子容器没有做任何限制,子容器可以任意大小

    • MODE:分为一下三种类别,

    • SIZE是父容器为子容器提供的大小

实例说明:

(1)首先我们新建一个View,重写onMeasure()方法.

  1. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

  2. // TODO Auto-generated method stub

  3. super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  4. setMeasuredDimension(measureHeight(widthMeasureSpec), measureHeight(heightMeasureSpec));

  5. }

  6. private int measureHeight(int heightMeasureSpec) {

  7. // TODO Auto-generated method stub

  8. int result=0; //结果

  9. int specMode=MeasureSpec.getMode(heightMeasureSpec);

  10. int specSize=MeasureSpec.getSize(heightMeasureSpec);

  11. switch (specMode) {

  12. case MeasureSpec.AT_MOST: // 子容器可以是声明大小内的任意大小

  13. Log.e(Tag, "子容器可以是声明大小内的任意大小");

  14. Log.e(Tag, "大小为:"+specSize);

  15. result=specSize;

  16. break;

  17. case MeasureSpec.EXACTLY: //父容器已经为子容器设置了尺寸,子容器应当服从这些边界,不论子容器想要多大的空间. 比如EditTextView中的DrawLeft

  18. Log.e(Tag, "父容器已经为子容器设置了尺寸,子容器应当服从这些边界,不论子容器想要多大的空间");

  19. Log.e(Tag, "大小为:"+specSize);

  20. result=specSize;

  21. break;

  22. case MeasureSpec.UNSPECIFIED: //父容器对于子容器没有任何限制,子容器想要多大就多大. 所以完全取决于子view的大小

  23. Log.e(Tag, "父容器对于子容器没有任何限制,子容器想要多大就多大");

  24. Log.e(Tag, "大小为:"+specSize);

  25. result=1500;

  26. break;

  27. default:

  28. break;

  29. }

  30. return result;

  31. }

(2)然后我们在布局文件中写如下布局:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  2. android:layout_width="fill_parent"

  3. android:layout_height="fill_parent"

  4. android:orientation="vertical" >

  5. <HorizontalScrollView

  6. android:layout_width="wrap_content"

  7. android:layout_height="wrap_content" >

  8. <com.example.circleimage.CustomView1

  9. android:layout_width="1999dp"

  10. android:layout_height="40dp"

  11. android:background="#99CCCC" />

  12. </HorizontalScrollView>

  13. <com.example.circleimage.CustomView1

  14. android:layout_width="wrap_content"

  15. android:layout_height="40dp"

  16. android:background="#99CCCC" />

  17. </LinearLayout>

 

这个是运行后的结果,从上面我们可以看出:

  • 第一个CustomView1的父容器为HorizontalScrollView,HorizontalScrollView对它的子容器的width是没有任何限制的,所以当width设置为19999dp时子容器的宽度去决定于自己的宽度(属于UNSPECIFIED),size大小为0.

  • 第一个CustomView1的高度设置为40dp时(80px),这时候父容器为它设定了具体的值(属于EXACTLY

  • 第二个CustomView1的宽度设置为wrap_content时,这时父容器为它做了限制,只要在父容器设置的尺寸(720px)之内都可以。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
android中onMeasure初看,深入理解布局之一!
Android 自定义 View Measure 过程
自定义View(八)-View的工作原理- View的measure
Android自定义View(三、深入解析控件测量onMeasure)
Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2
Android 继承ViewGroup研究(3)–在XML向ViewGroup中添加组件 ...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服