Android addOnLayoutChangeListener vs addOnGlobalLayoutListener vs post(可运行r)

Android addOnLayoutChangeListener vs addOnGlobalLayoutListener vs post(可运行r),android,layout,view,measure,Android,Layout,View,Measure,问题: 假设我们有一个简单的例子:我们有视图,我们必须显示这个视图上的一些数据。我们使用静态方法showData(视图)来实现这一点。我想知道测量视图布局的确切时间,我可以访问getWidth()getHeight(),并确保这是我视图的最终宽度和高度 我所知道的(不确定我是否100%正确): 我知道三种不同的方法来做这件事 view.addOnLayoutChangeListener-我们知道当布局更改时,我们 可以得到高度和宽度 view.getViewTreeObserver().add

问题: 假设我们有一个简单的例子:我们有视图,我们必须显示这个视图上的一些数据。我们使用静态方法showData(视图)来实现这一点。我想知道测量视图布局的确切时间,我可以访问getWidth()getHeight(),并确保这是我视图的最终宽度和高度

我所知道的(不确定我是否100%正确):

我知道三种不同的方法来做这件事

  • view.addOnLayoutChangeListener-我们知道当布局更改时,我们 可以得到高度和宽度
  • view.getViewTreeObserver().addOnGlobalLayoutListener-我的案例 几乎一样,但我们稍后会得到信息。因为布局改变了 从孩子到根,从根到子,从根到子 (对吗?)
  • view.post(Runnable r)-正在工作,但我不知道为什么Runnable会工作 “发布到ui”线程在测量视图后执行
问题: 了解视图是否已测量的最佳方法是什么?为什么

了解视图是否已测量的最佳方法是什么

最好的方法是什么
OnGlobalLayoutListener
View.getMeasuredHeight()
View.getMeasuredWidth()

为什么

因为你妈妈比你更了解你自己,所以最好咨询
ViewGroup
,了解它的状态,这会自动反映孩子们的情况


View.post()。Ui队列={1,2},稍后在调用该行={1,2,runnable}之后。所以它肯定会在1,2之后运行(谢谢你:),但是onLayoutChange也会被父视图组调用,那么为什么OnGlobalYoutListener是更好的选择呢?我还想知道View.post()。所以,若我调用了方法showData(View-View),下一行是View.post(Runnable-r),那个么Runnable将在视图被测量并具有精确布局后执行吗?我的意思是view.post(r)不能发生在showData(view v)和onMeasure?之间,当您调用view.Gone时,在子视图上,ViewGroup将触发OnGlobalYoutListener,它可能调用onlayoutchange,也就是说,当边界更改时,在GlobalYout上是家庭状态,如果更改,则通知母亲,当您使用object animator为视图设置动画时,它将被触发,这只是一个示例,因此如果您真的想要监视,您将需要使用它,而不是经常调用它,view.post()就像我说的那样将其排队,这样可能会出现它总是落后于操作系统初始定义的调用的情况,@comte1986希望它能有所帮助