前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Activity中测量控件宽高的三种方式

在Activity中测量控件宽高的三种方式

作者头像
故乡的樱花开了
发布2024-09-25 07:52:09
1350
发布2024-09-25 07:52:09
举报
文章被收录于专栏:Android技术专栏

在进行Android开发时,有时需要测量控件的宽和高,常用的方式有以下三种:

(1)重写onWindowFocusChanged(hasFocus: Boolean)方法,在这个方法内获取控件的宽高

 这个方法在Activity的窗口焦点发生变化时调用,具体可以分为窗口获得焦点时和窗口失去焦点时。Activity的焦点发生变化时,相关的视图层次结构已经完成了测量,布局和绘制。

  • 获得焦点:当Activity的窗口从后台回到前台,或者从其他窗口中恢复。当获得焦点时,hasFocus传入true。
  • 失去焦点:当Activity的窗口被其他的窗口覆盖,或者用户按下home键使应用进入后台。当失去焦点时,hasFocus传入false。

(2)调用View的post(Runnable action)方法,在run方法中获取控件的宽高

  View的绘制过程包括onMesure(测量控件的宽高),onLayout(布局),onDraw(绘制)。post方法确保了所传递的Runnable对象会在视图树的测量,布局和绘制完成之后才运行,所以测试可以获取到控件的宽和高。

(3)观察者模式,给ViewTreeObserver添加监听器,在重写的方法onGlobalLayout()中获取控件的宽高

  ViewTreeObserver是一个监听视图树整体变化的类,它可以观察到视图树的各种全局事件。通过ViewTreeObserver,我们可以在视图树的布局过程完成之后获取到控件的宽高信息。

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {
    private lateinit var tv: TextView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tv=findViewById(R.id.tv)
        tv.post(object:Runnable{//第一种方式
            override fun run() {
                val width=tv.width
                val height=tv.height
                Log.i("post","width=${width},height=${height}")
            }

        })
        tv.viewTreeObserver.addOnGlobalLayoutListener(object:ViewTreeObserver.OnGlobalLayoutListener{//第二种方式
            override fun onGlobalLayout() {
                val width=tv.width
                val height=tv.height
                Log.i("viewTreeObserver","width=${width},height=${height}")
            }
        })
    }

    override fun onWindowFocusChanged(hasFocus: Boolean) {//第三种方式
        super.onWindowFocusChanged(hasFocus)
        val width=tv.width
        val height=tv.height
        Log.i("onWindowFocusChanged","width=${width},height=${height}")
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档