gpt4 book ai didi

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

转载 作者:撒哈拉 更新时间:2024-09-24 18:18:58 56 4
gpt4 key购买 nike

在进行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,我们可以在视图树的布局过程完成之后获取到控件的宽高信息.

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}")
    }
}

  。

  

最后此篇关于在Activity中测量控件宽高的三种方式的文章就讲到这里了,如果你想了解更多关于在Activity中测量控件宽高的三种方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com