获取View的width,height的正确方式
2015-08-26 14:24
204 查看
今天做了一个视频的简单缩放,根据父容器大小,缩放一倍。但是做的过程中发现得到父容器的width,height为0,查了一下资料,找到了解决办法。
代码如下:
不能直接实例化,而是通过getViewTreeObserver()获得。
ViewTreeObserver 的内部类:
OnGlobalLayoutListener
当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。
interface ViewTreeObserver.OnGlobalFocusChangeListener
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
代码如下:
final View view = findViewById(R.id.layout); ViewTreeObserver observer = view.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // TODO Auto-generated method stub view.getViewTreeObserver().removeOnGlobalLayoutListener(this); Log.e("tag", "width = "+ view.getWidth()); Log.e("tag", "height = "+ view.getHeight()); } }); }
原因:
在onCreate中,我们的控件其实还并没有画好,换句话说,等onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0。解决:
我们注册一个ViewTreeObserver的监听回调,这个监听回调,就是专门监听绘图的,既然是监听绘图,那么我们自然可以获取测量值了,同时,我们在每次监听前remove前一次的监听,避免重复监听。扩展:
ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。
ViewTreeObserver 的内部类:
OnGlobalLayoutListener
当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。
interface ViewTreeObserver.OnGlobalFocusChangeListener
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
相关文章推荐
- 【Java关键字-访问范围修饰符】private、protected、public和default的区别
- ov9650学习(1)
- 数据库设计三大范式
- 如何修改管理中心端口号
- 中国互联网11个创业派系456创始人名单大全
- 欢迎来到“渣渣写博客"
- Checking API: checkapi-last make update-api
- 《Servlet与JSP核心编程第二版》阅读记录001-环境搭建
- 网络敲诈勒索案:不交保护费 就让你服务器瘫痪
- 黑马程序员——List接口
- python idle 清屏问题的解决
- 在Linux Bash通过上下键快速查找历史命令
- 将SAMPLE database的数据移到MYDB1 database上
- 东方财富上半年净利同比大增30倍
- nginx简单使用
- Intel 82599 ixgbe & ixgbevf CNA 卡驱动分析02——VF/PF/MailBox
- 针对小米手机收不到推送的解决方案
- 如何修改SharePoint服务器数据库连接字符串
- Android SDK Manager国内无法更新的解决方案
- 【iOS】编译静态库