android中获取view在布局中的高度和宽度
来源:互联网 发布:电脑连不上网络错误711 编辑:程序博客网 时间:2024/05/19 13:57
有时需要在 onCreate()
方法中获取某个 View 组件的宽度和高度,而直接调用 getWidth()
、getHeight()
、getMeasuredWidth()
、getMeasuredHeight()
方法只会得到 0。
实现方法
一、使用 View.measure 测量 View
该方法测量的宽度和高度可能与视图绘制完成后的真实的宽度和高度不一致。
int width = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);int height = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);view.measure(width, height);view.getMeasuredWidth(); // 获取宽度view.getMeasuredHeight(); // 获取高度
二、使用 ViewTreeObserver. OnPreDrawListener 监听事件
在视图将要绘制时调用该监听事件,会被调用多次,因此获取到视图的宽度和高度后要移除该监听事件。
view.getViewTreeObserver().addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { view.getViewTreeObserver().removeOnPreDrawListener(this); view.getWidth(); // 获取宽度 view.getHeight(); // 获取高度 return true; }});
三、使用 ViewTreeObserver. OnGlobalLayoutListener 监听事件
在布局发生改变或者某个视图的可视状态发生改变时调用该事件,会被多次调用,因此需要在获取到视图的宽度和高度后执行 remove 方法移除该监听事件。
view.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { view.getViewTreeObserver() .removeOnGlobalLayoutListener(this); } else { view.getViewTreeObserver() .removeGlobalOnLayoutListener(this); } view.getWidth(); // 获取宽度 view.getHeight(); // 获取高度 }});
四、重写 View 的 onSizeChanged 方法
在视图的大小发生改变时调用该方法,会被多次调用,因此获取到宽度和高度后需要考虑禁用掉代码。
该实现方法需要继承 View,且多次被调用,不建议使用。
@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); view.getWidth(); // 获取宽度 view.getHeight(); // 获取高度}
五、重写 View 的 onLayout 方法
该方法会被多次调用,获取到宽度和高度后需要考虑禁用掉代码。
该实现方法需要继承 View,且多次被调用,不建议使用。
@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); view.getWidth(); // 获取宽度 view.getHeight(); // 获取高度}
六、使用 View.OnLayoutChangeListener 监听事件(API >= 11)
在视图的 layout 改变时调用该事件,会被多次调用,因此需要在获取到视图的宽度和高度后执行 remove 方法移除该监听事件。
view.addOnLayoutChangeListener( new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int l, int t, int r, int b, int oldL, int oldT, int oldR, int oldB) { view.removeOnLayoutChangeListener(this); view.getWidth(); // 获取宽度 view.getHeight(); // 获取高度 }});
七、使用 View.post() 方法
Runnable 对象中的方法会在 View 的 measure、layout 等事件完成后触发。
UI 事件队列会按顺序处理事件,在 setContentView() 被调用后,事件队列中会包含一个要求重新 layout 的 message,所以任何 post 到队列中的 Runnable 对象都会在 Layout 发生变化后执行。
该方法只会执行一次,且逻辑简单,建议使用。
view.post(new Runnable() { @Override public void run() { view.getWidth(); // 获取宽度 view.getHeight(); // 获取高度 }});
阅读全文
0 0
- android中获取view在布局中的高度和宽度
- 获取view的高度和宽度(在onCreate方法中)
- 在oncreate中如何获取view的高度和宽度
- 如何在onCreate中获取View的高度和宽度
- Android 获取View的高度和宽度
- Android获取View的宽度和高度
- Android获取View的宽度和高度
- android 中 view 的宽度和高度
- android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android在OnCreate中获取控件的宽度和高度
- Android Makefile之默认Ringtone显示None
- Windows 安装itk
- day3
- 《高性能MySQL》 第二章 MySQL基准测试
- 洛谷P1590 失踪的7
- android中获取view在布局中的高度和宽度
- php框架-lavarel安装
- 键盘按键码表
- 莫队
- JavaScript继承方式
- OpenCV实现遍历文件夹下所有文件
- UVA Live 7146 Defeat the Enemy——STL
- java对象转map
- 如何把数字证书导入到Windows根证书存储区