addOnLayoutChangeListener和onLayout(已更改)之间的区别?

我有一堂课

public class FancyView extends View implements View.OnTouchListener {

我需要获取视图的高度/宽度。

(它可以随着设备旋转而改变,当然,在初始化时,高度/宽度是未知的。)

你可以这样做...

所以,实际上在类FancyView只是重写onLayout(changed)

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    int hh = getHeight();
    Log.d("~", "Using onLayout(changed), height is known: " +hh);
}

或者,你可以这样做......

再次在类FancyView使用addOnLayoutChangeListener

private void init() {
    addOnLayoutChangeListener(new OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top,
                                   int right, int bottom, int oldLeft, int oldTop,
                                   int oldRight, int oldBottom) {
            Log.d("~", "Using addOnLayoutChangeListener, height is known: " +hh);
        }
    });

}

(另外:我猜init()是做这件事的最好的地方。)

两者似乎都很好。

(A)添加监听器和addOnLayoutChangeListener并交替(B)覆盖onLayout(boolean changed

用例:在类FancyView我在图像上绘制一些东西; 所以我需要知道宽度/高度需要绘制的尺寸。


脚注。 我注意到无论讨论的问题是“Android,获取宽度还是高度”,通常都会建议使用onWindowFocusChanged 9,因为“更容易”)。 我真的不明白为什么你会这样做,当onLayout(改变)可用; 也许我错过了一些东西。


方法addOnLayoutChangeListener是公共的,所以它允许添加一个外部更改侦听器。 OTOH onLayout受到保护,因此仅供内部使用。

对于内部使用,我的理解是这两种方法都提供了相同的结果,但覆盖更清晰一些。

检查源代码视图我看到使用更改侦听器的方法是

public void layout(int l, int t, int r, int b)

此方法在内部调用onLayout并更改侦听器,以确认两个方法是相同的,因为它们以相同方式触发。 如果在任何情况下它们不是同时被调用的,可能是由于控制实现上的错误引起的。

链接地址: http://www.djcxy.com/p/37219.html

上一篇: Difference between addOnLayoutChangeListener and onLayout(changed)?

下一篇: asynchronous dependency injection