как получить представление о координатах события в Android? - PullRequest
25 голосов
/ 12 ноября 2010

Я хочу перехватить события касания в моем родительском представлении с помощью onInterceptTouchEvent (MotionEvent ev).

Оттуда я хочу узнать, по какому виду щелкали, чтобы делать другие вещи, есть ли способ узнать, по какому виду щелкнули из полученного события движения?

Ответы [ 3 ]

80 голосов
/ 14 января 2011

Хорошо для тех, кто хочет знать, что я сделал ... я не мог. Я сделал обходной путь, чтобы просто узнать, был ли выбран конкретный компонент представления, поэтому я мог закончить только этим:

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

Однако это работает только для известных видов в макете, которые вы можете передать в качестве параметра, но я все еще не могу получить вид с щелчком, просто зная координаты. Вы можете искать все виды в макете, хотя.

4 голосов
/ 23 июня 2012

Простой способ получения касанного представления - установить 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);
            ....
            ....
3 голосов
/ 20 февраля 2016

Просто чтобы сделать способ хтафоя проще:

/**
* 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())));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...