如何在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())));
}