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

android根据坐标获取相应控件,判断点是否在控件上

2015-03-16 11:29 357 查看
本文转自:http://www.2cto.com/kf/201501/370226.html

/**

* 根据坐标获取相对应的子控件<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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐