您的位置:首页 > 移动开发 > Android开发

Android 根据坐标获取控件方法

2015-01-14 14:07 411 查看
/**
* 根据坐标获取相对应的子控件<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: