如果我知道坐标(X,Y)像素(通过OnTouchEvent方法和getX(),getY)我如何找到元素ex。按钮或文字等....使用 X,Y
答案 0 :(得分:20)
您可以使用每个子视图的getHitRect(outRect)
并检查该点是否在结果矩形中。这是一个快速的样本。
for(int _numChildren = getChildCount(); --_numChildren)
{
View _child = getChildAt(_numChildren);
Rect _bounds = new Rect();
_child.getHitRect(_bounds);
if (_bounds.contains(x, y)
// In View = true!!!
}
希望这有帮助,
FuzzicalLogic
答案 1 :(得分:5)
稍微更完整的答案,接受任何ViewGroup
,并将递归搜索给定x,y处的视图。
private View findViewAt(ViewGroup viewGroup, int x, int y) {
for(int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof ViewGroup) {
View foundView = findViewAt((ViewGroup) child, x, y);
if (foundView != null && foundView.isShown()) {
return foundView;
}
} else {
int[] location = new int[2];
child.getLocationOnScreen(location);
Rect rect = new Rect(location[0], location[1], location[0] + child.getWidth(), location[1] + child.getHeight());
if (rect.contains(x, y)) {
return child;
}
}
}
return null;
}
答案 2 :(得分:2)
与https://stackoverflow.com/a/10959466/2557258相同的解决方案,但在kotlin中:
fun ViewGroup.getViewByCoordinates(x: Float, y: Float) : View? {
(viewGroup.childCount - 1 downTo 0)
.map { this.getChildAt(it) }
.forEach {
val bounds = Rect()
it.getHitRect(bounds)
if (bounds.contains(x.toInt(), y.toInt())) {
return it
}
}
return null
}
答案 3 :(得分:1)
@Luke提供的答案的修改。使用getHitRect
而非getLocationOnScreen
的区别。我发现getLocationOnScreen
所选择的视图不正确。还将代码转换为Kotlin并将其扩展为ViewGroup
:
/**
* Find the [View] at the provided [x] and [y] coordinates within the [ViewGroup].
*/
fun ViewGroup.findViewAt(x: Int, y: Int): View? {
for (i in 0 until childCount) {
val child = getChildAt(i)
if (child is ViewGroup) {
val foundView = child.findViewAt(x, y)
if (foundView != null && foundView.isShown) {
return foundView
}
} else {
val rect = Rect()
child.getHitRect(rect)
if (rect.contains(x, y)) {
return child
}
}
}
return null
}
答案 4 :(得分:0)
Android使用dispatchKeyEvent / dispatchTouchEvent来查找处理键/触摸事件的正确视图,这是一个复杂的过程。由于可能有许多视图覆盖(x,y)点。
但如果您只想找到覆盖(x,y)点的最顶部视图,那就很简单。
1使用getLocationOnScreen()获取绝对位置。
2使用getWidth(),getHeight()来确定视图是否覆盖(x,y)点。
3在整个视图树中查看视图的级别。 (递归调用getParent()或使用某种搜索方法)
4找到既包含要点又具有最高等级的视图。