如何获得视图的绝对坐标

我试图获取视图左上角的绝对屏幕像素坐标。 但是,我可以找到的所有方法getLeft()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]);

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

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

我不知道这是否有意义,但ImageView最初没有给出大小。 当我给它一个图像来显示时, ImageView的大小在初始化期间由View自动确定。 这可能有助于他们的值为0,即使这些日志代码是在它们被赋予一个图像并自动调整大小后? 为了防止这种情况发生,我添加了如上所示的代码tableLayout.requestLayout() ,但这并没有帮助。


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


首先,您必须获取视图的localVisible矩形

例如:

Rect rectf = new Rect();

//For coordinates location relative to the parent
anyView.getLocalVisibleRect(rectf);

//For coordinates location relative to the screen/display
anyView.getGlobalVisibleRect(rectf);

Log.d("WIDTH        :", String.valueOf(rectf.width()));
Log.d("HEIGHT       :", String.valueOf(rectf.height()));
Log.d("left         :", String.valueOf(rectf.left));
Log.d("right        :", String.valueOf(rectf.right));
Log.d("top          :", String.valueOf(rectf.top));
Log.d("bottom       :", String.valueOf(rectf.bottom));

希望这会有所帮助


接受的答案实际上并没有说明如何获得位置,所以这里有一些细节。 您传入一个长度为2的int数组,并将值替换为视图的(x,y)坐标(顶部,左上角)。

int[] location = new int[2];
myView.getLocationOnScreen(location);
int x = location[0];
int y = location[1];

笔记

  • 在大多数情况下用getLocationInWindow替换getLocationOnScreen应该会得到相同的结果(请参阅此答案)。 但是,如果您使用的是对话框或自定义键盘等较小的窗口,则使用您需要选择哪一个更适合您的需求。
  • 如果您在onCreate调用此方法,您将得到(0,0) ,因为视图尚未布置。 您可以使用ViewTreeObserver来监听布局何时完成,并且您可以获取测量的坐标。 (看到这个答案。)
  • 链接地址: http://www.djcxy.com/p/78291.html

    上一篇: How to get the absolute coordinates of a view

    下一篇: Determining the entry shown is listview