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

2024-09-25 07:52:09 浏览数 (3)

在进行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}")
    }
}

0 人点赞