Android中获取控件宽高的4大方法
16lz
2021-01-23
借鉴自开发艺术
1.onWindowFocusChanged
这个方法会被调用多次,在View初始化完毕后会调用,当Activity的窗口得到焦点和失去焦点都会被调用一次(Activity继续执行和暂停执行时)。
@Overridepublic void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); }}2.view.post
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewGroup root = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.activity_main, null, false); setContentView(root); final View view = root; view.post(new Runnable() { @Override public void run() { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); Log.i(TAG, width + " " + height); } });}具体原理暂时还不懂,不过应该是view封装的异步回调初始化后,view的测绘多半也完成了,这是一个同步的过程。所以才可以接收到消息。
3.ViewTreeObserver
他有许多回调。比如当View树的状态发生改变或者View树内部的View可见性发现改变时,onGlobalLayout方法将被回调。
final View view = root;ViewTreeObserver observer = view.getViewTreeObserver();observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); Log.i(TAG, width + " " + height); }});通过一种增加global listener又移除的方式,获取观察而来的消息。
4.view.measure
手动测绘,分3种情况:
一、match_parent
这个情况是获取不到的。构造这种情况的MeasureSpec需要知道父容器的剩余空间。
二、具体的数值(dp/px)
比如宽高都是100px,可以这样做:
View view = root;int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);view.measure(widthMeasureSpec, heightMeasureSpec);Log.i(TAG, widthMeasureSpec + " " + heightMeasureSpec);到这里为止了,这种方法不推荐,因为测出来发现有错误。
更多相关文章
- Android 设备网络信息的获取(网络类型、网络强度、网络速度、代理
- Android消息机制学习
- 重磅消息!Android与IOS的合体!高仿IOS动态高斯模糊背景!
- Android的消息提示框,ImageView,进度条
- 【Android】Android如何查看分区情况
- 微软和亚马逊在Android方面的最新消息
- 关于 Android 异步消息处理机制 Handler
- android消息机制,异步和多线程