Android获取UI控件的宽高
2015-09-17 22:45
387 查看
一、概述
我们如果开发一些依赖于UI控件宽高的功能,那么自然会想到调用View的getHeigth()和getWidth()方法,对于新手来说,这里有一个坑,你在Activity中的onCreate()方法中去获取控件的宽高,会神奇的发现返回值都是0,大家一起跟我看这个坑怎么来填。二、分析问题
首先分析一下,为什么在onCreate里面获取到UI控件的宽高是0呢?当该方法被调用,会通过LayoutInflater将XML布局加载到ContentView中,这个加载的过程仅仅包含创建视图,却不包括设置其大小。
那么视图的大小是在何时指定的呢?
根据Android开发者文档解释如下:
绘制布局包含两个过程:测量过程和布局过程:
**测量过程:**measure(int,int)方法完成,该方法从上到下遍历视图树,在递归遍历的过程中,每个视图都会向下层传递尺寸和规格,遍历结束之后,每个视图save了各自的尺寸信息
**布局过程:**layout(int,int,int,int)方法完成,该方法也是从上倒下遍历视图树,在遍历的过程中,每个ViewGroup根据测量过程中的结果定位自己的childView的位置信息。
三、得出结论
bingo,我们就可以得出一个结论,只有当整个布局绘制完成之后,视图才能得到自身的宽和高,而这个过程发生在onCreate()之后,因为在此之前调用获取控件宽高的方法,必然返回值是0;四、获取宽高
贴出代码:[code] private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView)findViewById(R.id.tv); //方法1:获取控件的大小 View post方法来来获取,该方法接收一 个Runnable,该线程会在UI线程中执行 tv.post(new Runnable() { @Override public void run() { Log.i("Tag","heigth:"+tv.getHeight()+"width:"+tv.getWidth()); } }); //方法2:获取控件的大小 int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); tv.measure(w, h); int height =tv.getMeasuredHeight(); int width =tv.getMeasuredWidth(); tv.append("\n"+height + "," + width); //方法3:获取控件的大小 ViewTreeObserver vto = tv.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { int height = tv.getMeasuredHeight(); int width = tv.getMeasuredWidth(); tv.append("\n" + height + "," + width); return true; } }); }
五、总结
打一个比方:将XML比喻成***肉夹馍的食谱(我是陕西的所以用肉夹馍来举例子),LayoutInflate类就是购买面粉肉等食材的人,测量和布局过程就是***肉夹馍的师傅,而在onCreate里面只是购买了肉夹馍的食材,仅仅知道了食材难道你就能确定它的大小么?相关文章推荐
- U3D UGUI学习3 - Text
- Implement Queue using Stacks
- iOS中的UIToolBar
- U3D UGUI学习2 - RectTransform
- error: Autoconf version 2.67 or higher is required
- IOS 刷新UItableView 中的行或组详细介绍
- 第五讲:OpenGL坐标系和UIKit坐标系、锚点、addChild函数详解
- iOS -初识UIKit
- request.getAttribute和request.getParameter的区别
- UiAutomator 测试报告查看与分析
- 国际象棋模拟
- 【APUE】Chapter8 Process Control
- 类实现序列化时的serialVersionUID的作用
- UiAutomator 简单测试脚本示例
- easyui 动态修改窗口title
- iOS开发:自定义UITabBarController标签控制栏
- android关于Handler更新UI的用法
- UGUI Canvas 与 特效
- UI10_UIImageView
- UI09_协议控制