/** * 根据坐标获取相对应的子控件<br> * 在Activity使用 * * @param x坐标 * @param y坐标 * @return 目标View */ public View getViewAtActivity(int x, int y) { // 从Activity里获取容器 View root = getWindow().getDecorView(); return findViewByXY(root, x, y); } /** * 根据坐标获取相对应的子控件<br> * 在重写ViewGroup使用 * * @param x坐标 * @param y坐标 * @return 目标View */ public View getViewAtViewGroup(int x, int y) { return findViewByXY(this, x, y); } private View findViewByXY(View view, int x, int y) { View targetView = null; if (view instanceof ViewGroup) { // 父容器,遍历子控件 ViewGroup v = (ViewGroup) view; for (int i = 0; i < v.getChildCount(); i++) { targetView = findViewByXY(v.getChildAt(i), x, y); if (targetView != null) { break; } } } else { targetView = getTouchTarget(view, x, y); } return targetView; } private View getTouchTarget(View view, int x, int y) { View targetView = null; // 判断view是否可以聚焦 ArrayList<View> TouchableViews = view.getTouchables(); for (View child : TouchableViews) { if (isTouchPointInView(child, x, y)) { targetView = child; break; } } return targetView; } private boolean isTouchPointInView(View view, int x, int y) { int[] location = new int[2]; view.getLocationOnScreen(location); int left = location[0]; int top = location[1]; int right = left + view.getMeasuredWidth(); int bottom = top + view.getMeasuredHeight(); if (view.isClickable() && y >= top && y <= bottom && x >= left && x <= right) { return true; } return false; }
原文地址:http://blog.csdn.net/chenlove1/article/details/42709127