猿问

如何获取视图的绝对坐标

如何获取视图的绝对坐标

我正在尝试获取视图左上角的绝对屏幕像素坐标。但是,我可以找到的所有方法,例如getLeft()并且getRight()不起作用,因为它们似乎都相对于视图的父级,因此给了我0。这样做的正确方法是什么?

如果它有帮助,这是为了“让图片重新整理”游戏。我希望用户能够绘制一个框来选择多个部分。我的假设是,做到这一点的最简单方法是getRawX(),并getRawY()MotionEvent再兑布局保持件的左上角比较这些值。知道了件的大小,我就可以确定已经选择了多少件。我知道我可以使用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]);

所有初始化完成后添加此代码。图像被分成一个包含在a中的ImageViews(cells []数组)数组TableLayout。单元格[0]是左上角ImageView,我选择了单元格[4],因为它位于中间的某个位置,绝对不应该有(0,0)的坐标。

上面显示的代码仍然给我在日志中的所有0,我真的不明白,因为各种拼图正确显示。(我为tableLayoutCorners和默认可见性尝试了public int,两者都给出了相同的结果。)

我不知道这是否重要,但ImageViews最初没有给出尺寸。ImageView当我给它一个要显示的图像时,视图自动初始化时确定s 的大小。这可能会导致它们的值为0,即使这些日志代码是在它们被赋予图像并自动调整大小之后吗?为了解决这个问题,我添加了tableLayout.requestLayout()如上所示的代码,但这没有帮助。


郎朗坤
浏览 605回答 3
3回答

HUX布斯

使用View.getLocationOnScreen()和/或getLocationInWindow()。

ABOUTYOU

接受的答案实际上没有说明如何获得位置,所以这里有更多细节。传入int长度为2 的数组,并将值替换为视图的(x,y)坐标(顶部,左上角)。int[] location = new int[2];myView.getLocationOnScreen(location);int x = location[0];int y = location[1];笔记更换getLocationOnScreen用getLocationInWindow应该给在大多数情况下,相同的结果(见这个答案)。但是,如果您在像Dialog或自定义键盘这样的较小窗口中,那么您需要选择哪一个更适合您的需求。(0,0)如果您调用此方法,则会得到,onCreate因为视图尚未布局。您可以使用a ViewTreeObserver来监听布局完成后您可以获得测量的坐标。(见这个答案。)
随时随地看视频慕课网APP

相关分类

Android
我要回答