2012-06-09 38 views

Trả lời

15

Bạn có thể sử dụng getHitRect(outRect) của mỗi đứa trẻ Xem và kiểm tra xem điểm có nằm trong Hình chữ nhật kết quả không. Đây là một mẫu nhanh.

for(int _numChildren = getChildCount(); --_numChildren) 
{ 
    View _child = getChildAt(_numChildren); 
    Rect _bounds = new Rect(); 
    _child.getHitRect(_bounds); 
    if (_bounds.contains(x, y) 
     // In View = true!!! 
} 

Hope this helps,

FuzzicalLogic

+1

Tôi đã thử và nó hoạt động. –

+0

Hoạt động tốt nhưng có vẻ như đứa trẻ có thể là null, vì vậy cần kiểm tra để ngăn chặn NullPointerException. –

+0

nó hoạt động hoàn hảo. –

0

sử dụng Android dispatchKeyEvent/dispatchTouchEvent để tìm ra chánh kiến ​​để xử lý chủ chốt/cảm ứng sự kiện, đó là một thủ tục phức tạp. Vì có thể có nhiều khung nhìn che phủ điểm (x, y).

Nhưng thật đơn giản nếu bạn chỉ muốn tìm giao diện trên cùng nhất bao gồm điểm (x, y).

1 Sử dụng getLocationOnScreen() để lấy vị trí absoulte.

2 Sử dụng getWidth(), getHeight() để tìm hiểu xem chế độ xem có bao gồm điểm (x, y) hay không.

3 Làm giảm mức độ xem trong toàn bộ cây xem. (Gọi getParent() đệ quy hoặc sử dụng một số phương pháp tìm kiếm)

4 Tìm chế độ xem bao gồm cả điểm và có cấp độ lớn nhất.

4

Câu trả lời hoàn chỉnh hơn một chút chấp nhận bất kỳ ViewGroup và sẽ đệ quy tìm kiếm chế độ xem tại x, y đã cho.

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; 
} 
1

Các giải pháp tương tự như https://stackoverflow.com/a/10959466/2557258 nhưng trong Kotlin:

fun getViewByCoordinates(viewGroup: ViewGroup, x: Float, y: Float) : View? { 
    (0 until viewGroup.childCount) 
      .map { viewGroup.getChildAt(it) } 
      .forEach { 
       val bounds = Rect() 
       it.getHitRect(bounds) 
       if (bounds.contains(x.toInt(), y.toInt())) { 
        return it 
       } 
      } 
    return null 
} 
Các vấn đề liên quan