如何获取视图的绝对坐标

456
我试图获取一个视图左上角的绝对屏幕像素坐标。但是,我能找到的所有方法(如getLeft()getRight())都不起作用,因为它们似乎都是相对于视图的父元素而言的,从而给出了0。有没有正确的方法来做到这一点?
如果可以的话,这是为“将图片放回原位”游戏而做的。我希望用户能够绘制一个框来选择多个碎片。我的假设是最简单的方法是从MotionEvent中获取getRawX()getRawY(),然后将这些值与包含碎片的布局的左上角进行比较。知道了碎片的大小后,我就可以确定选择了多少个碎片。我知道我可以使用getX()getY()MotionEvent上,但是由于它返回的是相对位置,这使得确定选择哪些碎片更加困难。(我知道这并非不可能,但似乎过于复杂)。
编辑:这是我尝试根据问题中的一个答案获取持有容器大小的代码。 TableLayout是包含所有拼图碎片的表格。
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());

编辑2:这是我尝试过的代码,遵循更多的建议答案。

public int[] tableLayoutCorners = new int[2];
(...)

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
            + ", " + corners.bottom);

cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);

这段代码是在所有初始化完成后添加的。该图像已经被分割成一个包含在TableLayout中的ImageView数组(cells[]数组)。Cells[0]是左上角的ImageView,我选择了cells[4]因为它位于中间且绝对不应该具有(0,0)的坐标。

上面显示的代码仍然在记录中给我返回了全部为0的值,这真的让我很困惑,因为各种拼图块都正确地显示了。(我尝试了将tableLayoutCorners设置为公共整数并使用默认可见性,但结果相同。)

我不知道这是否重要,但最初ImageView没有给出大小。在初始化期间,当我给它一张图片来展示时,ImageView的大小会自动由View确定。即使在他们已经得到一张图片并自动调整大小之后,这是否会导致他们的值为0呢?为了潜在地解决这个问题,我添加了如上所示的tableLayout.requestLayout()代码,但这并没有帮助。

11个回答

0
binding.ivStory.setOnTouchListener(object : View.OnTouchListener{
        override fun onTouch(p0: View?, event: MotionEvent?): Boolean {
            val x = event?.x
            vak y = event?.y

            when (event!!.action) {
                MotionEvent.ACTION_UP ->

                if (x != null) {
                   //Do your stuff                    }

                MotionEvent.ACTION_DOWN  -> {

                }
            }
            return true
        }

    })

这是Kotlin获取屏幕视图坐标的方式,当您触摸屏幕时。确保您处理Action UP和DOWN,否则可能会导致多次点击/触摸。

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