如何获得视图的绝对坐标
我试图获取视图左上角的绝对屏幕像素坐标。 但是,我可以找到的所有方法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
来监听布局何时完成,并且您可以获取测量的坐标。 (看到这个答案。)