获取view宽高最佳时机

获取view宽高有两种方法:

  1. getMeasrureHeight()/getNeasureWidth() :此方法在measure是对控件进行测量,在onMeasure后得到值。

    也可以在getMeasureHeight之前手动调用一下measure()方法获取高度。但手动measure需要根据View的LayoutParams来区分

    int widthMeasurewSpec;
    int HeightMeasurewSpec;
    //如果是match_parent,不要使用此方法,理论上不知道父容器的剩余空间所以无法准确测出数值
    
    //如果是具体的数值:100,250
    widthMeasurewSpec = MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY);
    HeightMeasurewSpec = MeasureSpec.makeMeasureSpec(250,MeasureSpec.EXACTLY);
    
    //如果是wrap_content
    widthMeasurewSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST);
    HeightMeasurewSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST);
    
    view.measure(widthMeasurewSpec, HeightMeasurewSpec);//主动通知系统去测headerView的高度
    int measuredHeight = view.getMeasuredHeight();

    p.s. 系统可能会通过多次么measure才能确定最终的宽高,因此还是在layout中获取最终宽高比较稳妥

  2. getHeight()/getWidth():此方法在onLayout后才能获取到值。所以它的使用方法最早就是在layout调用之后的回调中获取值

    headerView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    int Height = headerView.getHeight();
    headerView.getViewTreeObserver()
                    .removeGlobalOnLayoutListener(this);//一定要移除,因为onLayout()会执行多次,如果不移除的话 也会被回调多次,而且值还不一样
    }
    });

通常来讲,getHeight()和getMeasuredHeight()方法获取的值其实是一样的。当在代码中调用view的layout()方法对view的布局进行更改,时getHeight()获取到的是更改后的值。

使用时注意(本人的一些实践下的思路):

  存在取不到view宽高的情况,通常存在于对这个view修改之后不久就调用了这个 view的get宽高方法,所以才会出现get出来是0的情况,那么我们避免这种get出0根本的解决思路应该是:

  1. 首先不应该在修改前后取宽高(或在确定view绘制完成之后再来取)
  2. 其次是取确定已经绘制完成的相关view的宽高反推本view的宽高
  3. 最后逼不得已才是通过上述这种牺牲性能的方式取。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值