动态获取控件宽高的四种方式
2016-11-14 22:57
190 查看
1.通过View的监听树
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int height = view.getHeight(); int width = view.getwidth(); logD("topH=" + topH); //移除监听 view.getViewTreeObserver().removeOnGlobalLayoutListener(this); } });
2.申请测量View
view.measure(0,0); int height = view.getMeasuredHeight(); int width = view.getMeasureWidth();
这里的0为MeasureSpec.UNSPECIFIED,忽略父控件印象。手动测量控件。不推荐这个方法,当布局嵌套层级多的时候,会有偏差。
3.通过MessageQueue的执行顺序判断
view.post(new Runnable() { @Override public void run() { int height = view.getHeight(); int width = view.getwidth(); } });
View的绘制流程所有的事件都是通过主线程的MessageQueue统一管理,由于MessageQueue是的链表结构,新post一个事件并执行时,说明activity的measure()方法和layout()方法已经走完,自然可以直接拿到控件宽高。
4.在onWindowFocusChanged方法里获取
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); int height = view.getHeight(); int width = view.getwidth(); }
执行顺序为:Activity.oncreate()→Activity.onResume()→
→view.onMeasure()→view.onLayout()→onGlobalLayoutListener()→
→Activity.onWidnowFocusChanged()→…..→
→view.onDraw()
相关文章推荐
- 动态获取手机屏幕宽高及动态设置控件宽高
- Activity启动过程中获取控件宽高的方式
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- 动态加载用户控件----以用户控件的方式达到代码分离的目的
- 动态添加WEB控件,点控件获取动态添加的控件
- 动态加载用户控件及获取用户控件暴露的属性值
- 动态控件事件获得方式
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- 动态加载用户控件----以用户控件的方式达到代码分离的目的[转]
- asp.net动态添加控件和获取控件的值
- RichEdit20A控件内容的外部获取方式
- 动态添加 控件 并获取值
- ASP.NET 2.0 - 如何以程控方式动态建立一个 GridView 控件
- vs2005 web application页面动态添加控件获取属性值
- 浅析Page.LoadTemplate("模板")方法动态获取绑定模板后,通过FindControl获取服务端控件的方法。
- 获取ARRAYLIST 的某一列以及动态生成控件的方法
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- 动态创建服务器控件,获取HTML输出(用于生成静态文件,简化页面,简化编程等)
- 动态添加控件并获取其值
- 动态添加WEB控件,点控件获取动态添加的控件