如何在android中从事件坐标中获取视图?
我想用如何在android中从事件坐标中获取视图?,android,events,view,Android,Events,View,我想用onInterceptTouchEvent(MotionEvent ev)截取父视图上的触摸事件 从那里我想知道为了做其他事情而单击了哪个视图,有没有办法知道从收到的运动事件中单击了哪个视图?对于想知道我做了什么的人来说。。。我不能。我做了一个变通方法,只知道是否单击了我的特定视图组件,因此我只能以以下内容结束: if(isPointInsideView(ev.getRawX(), ev.getRawY(), myViewComponent)){ doSomething()
onInterceptTouchEvent(MotionEvent ev)
截取父视图上的触摸事件
从那里我想知道为了做其他事情而单击了哪个视图,有没有办法知道从收到的运动事件中单击了哪个视图?对于想知道我做了什么的人来说。。。我不能。我做了一个变通方法,只知道是否单击了我的特定视图组件,因此我只能以以下内容结束:
if(isPointInsideView(ev.getRawX(), ev.getRawY(), myViewComponent)){
doSomething()
}
方法是:
/**
* Determines if given points are inside view
* @param x - x coordinate of point
* @param y - y coordinate of point
* @param view - view object to compare
* @return true if the points are within view bounds, false otherwise
*/
public static boolean isPointInsideView(float x, float y, View view){
int location[] = new int[2];
view.getLocationOnScreen(location);
int viewX = location[0];
int viewY = location[1];
//point is inside view bounds
if(( x > viewX && x < (viewX + view.getWidth())) &&
( y > viewY && y < (viewY + view.getHeight()))){
return true;
} else {
return false;
}
}
/**
*确定给定点是否在视图内
*@param x-点的x坐标
*@param y-点的y坐标
*@param view-要比较的视图对象
*@如果点在视图范围内,则返回true,否则返回false
*/
公共静态布尔值isPointInsideView(浮点x、浮点y、视图){
int location[]=新int[2];
view.GetLocationOn屏幕(位置);
int viewX=位置[0];
int viewY=位置[1];
//点在视图边界内
如果((x>viewX&&x<(viewX+view.getWidth()))&&
(y>viewY&&y<(viewY+view.getHeight())){
返回true;
}否则{
返回false;
}
}
然而,这只适用于布局中可以作为参数传递的已知视图,我仍然无法仅通过知道坐标来获得单击的视图。您可以搜索布局中的所有视图。获取触摸视图的简单方法是为各个视图设置OnTouchListener,并将视图存储在活动的类变量中。 返回false将使输入事件可用于活动的onTouchEvent()方法,您可以在其中轻松处理所有触摸事件(以及父视图的触摸事件) 只是为了简化htafoya的方法:
/**
*确定给定点是否在视图内
*@param x-点的x坐标
*@param y-点的y坐标
*@param view-要比较的视图对象
*@如果点在视图范围内,则返回true,否则返回false
*/
私有布尔值isPointInsideView(浮点x、浮点y、视图){
int location[]=新int[2];
view.GetLocationOn屏幕(位置);
int viewX=位置[0];
int viewY=位置[1];
//点在视图边界内
返回((x>viewX&&x<(viewX+view.getWidth())&&
(y>viewY&&y<(viewY+view.getHeight());
}
private boolean isPointInsideView(float x,float y,View View View){Rect Rect=new Rect();View.getDrawingRect(Rect);return Rect.contains((int)x,(int)y);}建议:最好将方法设置为静态。@etienne,请注意getDrawingRect()返回有关滚动视图中显示的绘图Rect的信息。如果要获取嵌套在另一个视图中的视图的rect,则该操作无效。htafoya的解决方案按预期工作。@htafoya您知道如何获取当前视图的起始坐标,因为如果我在不同的位置单击同一视图,它会给出不同的坐标…:(..@Aniket viewX和viewY将具有这些值。重复上面的注释:view.getLocationOnScreen对我来说不起作用-我认为它可能会返回视图的中心坐标,因此单击必须位于视图的右下角,测试才能返回真值,因此本例中的边界检查是错误的。请使用此选项测试:(x>=view.getLeft()&&x=view.getTop()&&y
myView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
touchedView = myView;
return false;
}
});
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
if(touchedView!=null) {
doStuffWithMyView(touchedView);
....
....
/**
* Determines if given points are inside view
* @param x - x coordinate of point
* @param y - y coordinate of point
* @param view - view object to compare
* @return true if the points are within view bounds, false otherwise
*/
private boolean isPointInsideView(float x, float y, View view) {
int location[] = new int[2];
view.getLocationOnScreen(location);
int viewX = location[0];
int viewY = location[1];
// point is inside view bounds
return ((x > viewX && x < (viewX + view.getWidth())) &&
(y > viewY && y < (viewY + view.getHeight())));
}