Android 获得控件宽高

在Android中,直接通过getWidth()获取View宽度可能会得到0,因为此时View的测量过程未完成。本文介绍了多种正确获取View真实宽高的方法:1) 使用View.post()结合Runnable;2) 在onLayout()方法内获取;3) 添加ViewTreeObserver.OnGlobalLayoutListener监听;4) 使用addOnPreDrawListener;5) 实现View.OnLayoutChangeListener。在使用监听器后,务必记得移除以优化性能。
摘要由CSDN通过智能技术生成

一般我们在Activity中会用getWidth()方法,去获得view的宽度,但是不论在Oncreate()中,还是onResume()中,获得的值都是0

出现这种原因是因为,我们在调用getWidth()时,View还没执行完OnMeasure()方法。得到的自然就是0

1.最常用的:View.post()

利用handler的通信机制,当view layout处理完成时,自动发送消息,通知UI线程,这样就可以获得View的宽高属性

view.post(new Runnable() {
    @Override
    public void run() {
        int width = view.getWidth();
    }
});

2.onLayout()

利用绘图的生命周期,在onLayout() 方法获取宽高值

tv = new TextView(this) {
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        int a = tv.getWidth();
    }
};

3.addOnGlobalLayoutListener

ViewTreeObserver,视图树的观察者,可以监听 View 的全局变化事件

注意:使用时需要注意及时移除该事件的监听,避免后续每一次发生全局 View 变化均触发该事件,影响性能。这里用的是 OnGlobalLayoutListener&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值