监听一个视图的位置变化

9

如果一个视图在移动或其XY位置发生改变,我该如何监听它以获取其XY坐标?这个视图不一定是被拖动的(或由用户触摸事件),它可能会因为方向改变或被显示键盘推上(向上)等而发生改变。当它发生变化时,我想知道它的更新XY坐标,我应该怎么做?


你可以使用 onPreDrawListener 或者 onGlobalLayoutListener 来监听位置的变化。 - Wenhui
2个回答

12

你可以像这样做

final View activityRootView = findViewById(R.id.mainLayout);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
                new OnGlobalLayoutListener() {

                    @SuppressLint("NewApi")
                    @Override
                    public void onGlobalLayout() {
                        findViewById(R.id.textView).getX();
                        findViewById(R.id.textView).getY();

                    }
                });
希望这可以帮助到您。

9
除了在onGlobalLayout(或任何其他被多次调用的方法)中不要调用findViewById,因为它是昂贵的操作且您只需要执行一次,这是一个好的解决方案! - Alireza Ahmadi
如果要获取目标视图实例,addOnLayoutChangeListeneraddOnGlobalLayoutListener更好,因为addOnGlobalLayoutListener会由于根视图的所有子视图的更改而被调用。 - 1552980358

1

可能 addOnLayoutChangeListener 可以工作。它在视图的布局函数中检测到框架边界变化时调用。如果框架边界没有变化,而父边界发生了变化,从而改变了视图位置,那么我们可能不会在这里收到此事件,然后需要一些带有额外代码的 addOnGlobalLayoutListener 来比较屏幕上的实际位置,但我不会走这条路,因为它会引起其他问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接