Android 自定义控件关于measure的讲解

本文详细解析了Android中View的测量过程,包括getWidth(), getMeasureWidth(), measuredHeight与height的区别,以及如何在Activity的onCreate()方法中准确获取View的尺寸。同时,深入探讨了MeasureSpec的作用及三种模式,并提供了自定义View时确保宽度适应屏幕宽度的方法。
	首先在activity的onCreate(),方法中直接调用getWidth(),或者是调用getMeasureWidth(),此时获取的宽度都是为0,
	因为view还没有进行测量绘制,那么必须要在onCreate(),方法获取的话,可以通过监听视图树,代码如下:
   tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int measuredHeight = tv.getMeasuredHeight();
                int height= tv.getHeight();
                System.out.println("measuredHeight " + measuredHeight);
                System.out.println("height" + height);
                tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });

getMeasureHeight和getHeight 这两个方法的区别
//getMeasuredHeight 获取的是view原始的大小,也就是view在xml文件中配置的大小或者是view在代码中设置的大小,
//getHeight()获取的是view最终显示在屏幕的大小,这两个大小有可能是相等的
也可以通过手动测量获取View的大小,

  tv.measure(0,0);
   int measuredHeight = tv.getMeasuredHeight();
   int height = tv.getHeight();
   System.out.println("measuredHeight :" + measuredHeight);
   System.out.println("height :" + height);
  打印结果:
  2019-07-04 09:47:56.357 24488-24488/com.bisien.measure I/System.out: measuredHeight :59
  2019-07-04 09:47:56.357 24488-24488/com.bisien.measure I/System.out: height :0

tv.measure(0,0); 传递参数0和0表示测量交给系统去做,我们不参与任何的限制条件,但是这种方式大部分情况下都是正确的,一小部分是错误的,假设tv的text属性文字特别多,而且超过一行,这时测量的值就不正确。
widthMeasureSpec 包括两部分值,一个是size ,另一个是mode
size 这就不用多说就是控件的大小
mode 是包含三种模式:
1.AT_MOST 至多模式,在布局文件中匹配的是Worp_Content
2.EXACTLY 确定模式,在布局文件中写死的比如20dp,或者是Match_Parent
3.UNSPECIFIED 不确定的模式,在布局文件比如ListView、RecyclerView等控件
通过以下方式可以测量得到准确的值,

 		 Display defaultDisplay = getWindowManager().getDefaultDisplay();
        int width = defaultDisplay.getWidth();
        int height1 = defaultDisplay.getHeight();
        //给宽度加上设置条件,最多只有屏幕宽
        int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST);
        tv.measure(widthMeasureSpec,0);
        int measuredHeight = tv.getMeasuredHeight();

此时获取高度的话就是准确的值

---------------------------------------------------------上面是之前对measure的理解------------------------------------------------
下面是对measure进一步的理解,首先每个view想要显示出来,都必须经过实际的测量,
自定义侧滑删除,的心路历程
super.onMeasure(widthMeasureSpec, heightMeasureSpec) 这个方法最终调用的是下面这个方法
setMeasuredDimension(widthMeasureSpec,heightMeasureSpec) 作用是确定当前View的宽度和高度
假设 你定义的View 继承HorizontalScrollView,如果设置宽度为超过屏幕宽度,那么你的view将不会滑动
注意:如果自定义view为,recyclerView 条目的Item,那么记得在OnBindViewHolder中设置主布局的width 为屏幕的宽度,此时才可以实现侧滑删除,否则主布局和侧滑删除布局都显示出来,入下图所示:
在这里插入图片描述
holder.layout_content.getLayoutParams().width = 1080;
加载布局使用以下方式进行加载
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_main_hehe, parent, false);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值