如何从android中的事件坐标获取视图?

时间:2010-11-12 14:46:23

标签: android events view

我想用onInterceptTouchEvent (MotionEvent ev)拦截父视图上的触摸事件。

从那里我想知道点击了哪个视图以便做其他事情,有没有办法知道从收到的动议事件中点击了哪个视图?

3 个答案:

答案 0 :(得分:80)

对于任何想知道我做了什么的人来说......我做不到。我做了一个解决方法,只知道我的特定视图组件是否被点击,所以我只能以此结束:

   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;
    }
}

但是这只适用于您可以作为参数传递的布局中的已知视图,我仍然无法通过知道坐标来获取单击的视图。您可以搜索布局中的所有视图。

答案 1 :(得分:4)

获取触摸视图的一种简单方法是将OnTouchListener设置为各个视图,并将视图存储在活动的类变量中。 返回false将使输入事件可用于活动的onTouchEvent()方法,您可以轻松处理所有触摸事件(也是父视图的事件)。

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);
            ....
            ....

答案 2 :(得分:3)

只是为了使 htafoya 的方法更简单:

/**
* 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())));
}