how to get a view from an event coordinates in android?

前端 未结 3 1797
鱼传尺愫
鱼传尺愫 2020-12-01 03:36

I want to intercept the touch events on my parent view with onInterceptTouchEvent (MotionEvent ev).

From there I want to know which view was clicked in

相关标签:
3条回答
  • 2020-12-01 04:18

    A simple way for getting the touched view is to set an OnTouchListener to the individual views and store the view in a class variable of the activity. Returning false will make the input event available to the method onTouchEvent() of the activity, where you can easily handle all the touch events (also the ones of your parent view).

    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);
                ....
                ....
    
    0 讨论(0)
  • 2020-12-01 04:25

    Well for anyone who wants to know what I did ... i couldn't. I did a workaround to just know if my specific view component was clicked, so I could only end with this:

       if(isPointInsideView(ev.getRawX(), ev.getRawY(), myViewComponent)){
        doSomething()
       }
    

    and the method:

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

    However this only works for known views in the layout that you can pass as parameter, I still can't get the clicked view just by knowing the coordinates. You may search for all views in the layout though.

    0 讨论(0)
  • 2020-12-01 04:30

    Just to make method of htafoya simpler:

    /**
    * 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())));
    }
    
    0 讨论(0)
提交回复
热议问题