我正在尝试获取视图左上角的绝对屏幕像素坐标。但是,我能找到的所有方法,例如getLeft()
and getRight()
不起作用,因为它们似乎都与视图的父级相关,因此给了我0
。执行此操作的正确方法是什么?
如果有帮助的话,这是一个“将图片恢复正常”的游戏。我希望用户能够绘制一个框来选择多个部分。我的假设是最简单的方法是getRawX()
and getRawY()
来自MotionEvent
然后将这些值与包含碎片的布局的左上角进行比较。知道了碎片的大小,我就可以确定选择了多少碎片。我意识到我可以使用getX()
and getY()
on the 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]);
该代码是在所有初始化完成后添加的。图像已被划分为 ImageView 数组(cells[] 数组),其中包含TableLayout
。 Cells[0] 位于左上角ImageView
,我选择了 cells[4],因为它位于中间的某个位置,并且绝对不应该具有 (0,0) 的坐标。
上面显示的代码在日志中仍然给我全0,我真的不明白,因为各个拼图都正确显示。 (我尝试了 tableLayoutCorners 的 public int 和默认可见性,两者都给出了相同的结果。)
我不知道这是否重要,但是ImageView
s 最初没有给出尺寸。尺寸ImageView
当我给视图提供要显示的图像时,s 是在初始化过程中自动确定的。即使日志代码是在给定图像并自动调整自身大小之后,这是否会导致它们的值为 0?为了可能解决这个问题,我添加了代码tableLayout.requestLayout()
如上所示,但这没有帮助。