getLeft()
和getRight()
)都不起作用,因为它们似乎都是相对于视图的父元素而言的,从而给出了0
。有没有正确的方法来做到这一点?如果可以的话,这是为“将图片放回原位”游戏而做的。我希望用户能够绘制一个框来选择多个碎片。我的假设是最简单的方法是从
MotionEvent
中获取getRawX()
和getRawY()
,然后将这些值与包含碎片的布局的左上角进行比较。知道了碎片的大小后,我就可以确定选择了多少个碎片。我知道我可以使用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
中的ImageView数组(cells[]数组)。Cells[0]是左上角的ImageView
,我选择了cells[4]因为它位于中间且绝对不应该具有(0,0)的坐标。
上面显示的代码仍然在记录中给我返回了全部为0的值,这真的让我很困惑,因为各种拼图块都正确地显示了。(我尝试了将tableLayoutCorners设置为公共整数并使用默认可见性,但结果相同。)
我不知道这是否重要,但最初ImageView
没有给出大小。在初始化期间,当我给它一张图片来展示时,ImageView
的大小会自动由View确定。即使在他们已经得到一张图片并自动调整大小之后,这是否会导致他们的值为0呢?为了潜在地解决这个问题,我添加了如上所示的tableLayout.requestLayout()
代码,但这并没有帮助。