我试图获得一个视图的左上角的绝对屏幕像素坐标。然而,我能找到的所有方法,如getLeft()
和getRight()
都不起作用,因为它们似乎都相对于视图的父类,因此给了我0
。正确的做法是什么?
如果有帮助的话,这是一款“把图片按顺序放回去”的游戏。我希望用户能够画一个框来选择多个块。我的假设是最简单的方法是从MotionEvent
中getRawX()
和getRawY()
,然后将这些值与保存这些块的布局的左上角进行比较。知道了棋子的大小,我就可以确定选中了多少棋子。我意识到我可以在MotionEvent
上使用getX()
和getY()
,但由于返回的是一个相对位置,这使得确定哪些片段被选中更加困难。(我知道,这不是不可能的,但似乎没有必要这么复杂)。
编辑:这是我用来尝试得到持有容器的大小的代码,每一个问题。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,我真的不明白,因为各种拼图块被正确显示。(我尝试了公共int table elayoutcorners和默认可见性,两者都给出相同的结果。)
我不知道这是否重要,但__abc0最初没有给定大小。ImageView
s的大小是在初始化过程中由视图自动确定的,当我给它一个图像来显示。这是否会导致它们的值为0,即使日志代码是在给它们一个图像并自动调整自己的大小之后?为了潜在地解决这个问题,我添加了如上所示的代码tableLayout.requestLayout()
,但这并没有帮助。