Android новичок: понимание действий MotionEvent - PullRequest
13 голосов
/ 09 апреля 2010

У меня проблемы с получением активности для создания MotionEvent.ACTION_UP. Вероятно, ошибка новичка.

В LogCat я вижу только событие ACTION_MOVE (значение int равно 3). Я также вижу координаты X / Y. Нет ACTION_DOWN и нет ACTION_UP.

Я везде искал решение. Я нашел один вопрос на форуме, который, кажется, совпадает с моей проблемой, но решение не предлагается: http://groups.google.com/group/android-developers/browse_thread/thread/9a9c23e40f02c134/bf12b89561f204ad?lnk=gst&q=ACTION_UP#bf12b89561f204ad

Вот мой код:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.webkit.WebView;

public class Brand extends Activity {

public WebView webview;
public float currentXPosition;
public float currentYPosition;

@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

    webview = new WebView(this);
    setContentView(webview);
    webview.loadUrl("file:///android_asset/Brand.html");


 }

@Override
public boolean onTouchEvent(MotionEvent me) {

    int action = me.getAction();
    currentXPosition = me.getX();
    currentYPosition = me.getY();

    Log.v("MotionEvent", "Action = " + action);
    Log.v("MotionEvent", "X = " + currentXPosition + "Y = " + currentYPosition);

    if (action == MotionEvent.ACTION_MOVE) {
         // do something
    }


    if (action == MotionEvent.ACTION_UP) {
         // do something
    }

    return true;
  }

}

Ответы [ 2 ]

12 голосов
/ 15 февраля 2011

Сначала вам нужно следовать учебнику Webview , чтобы позволить WebViewClient вместо браузера по умолчанию работать. Без этого после загрузки веб-страницы вы вообще не получите никаких событий.

Если вы хотите обработать события в вашей деятельности, вы можете добавить метод dispatchTouchEvent :

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    Log.v("FROM_DISPATCH_TOUCH_EVENT", "Action = " + ev.getAction());
    return false; 
}

Вы увидите и другие сенсорные события. Вы должны обрабатывать их в этом методе.

Альтернативный способ - зарегистрировать EventListener. Ваш класс станет:

public class Brand extends Activity implements OnTouchListener {

in onCreate () сделать это:

webview.setOnTouchListener(this);

добавить это в активность:

@Override
public boolean onTouch(View v, MotionEvent event) {
   int action = event.getAction();
    float x = event.getX();
    float y = event.getY();

    Log.v("ON_TOUCH", "Action = " + action + " View:" + v.toString());
    Log.v("ON_TOUCH", "X = " + x + "Y = " + y);

return false;

}

Из моих логов я получаю следующее:

  1. dispatchTouchEvent () вызывается первым
  2. Тогда onTouch () называется
  3. Затем представление получает событие для обработки
  4. Тогда onTouchEvent () может получать события (см. Ниже)

Кроме того, onTouch () сообщает о просмотре, dispatchTouchEvent () сообщает о значениях, относящихся к отображению.

Почему onTouchEvent не сообщает об этих событиях? Как и многие из этих методов, есть два воплощения onTouchEvent () .

Если вы переопределяете onTouchEvent () в своей активности, это служит «ловить все» - оно обрабатывает только те события, которые не были использованы представлениями, например, если вы нажмете за пределами любого представления или события, переданные этими представлениями. Если вы переопределяете onTouchEvent () в своем View, он должен обрабатывать события в этом View. Иногда их легко спутать.

10 голосов
/ 09 апреля 2010

Ваша проблема в том, что вы делаете это из WebView. WebViews имеют встроенное сенсорное управление, позволяющее пользователю прокручивать страницу, и это должно мешать вам получать MotionEvents. Казалось бы, вам нужно будет использовать другой вид. Например, я просто запустил ваш код, сделав следующую замену:

TextView tv = new TextView(this);
setContentView(tv);

вместо

webview = new WebView(this);
setContentView(webview);
webview.loadUrl("file:///android_asset/Brand.html");

и все остальное работало. Примечание: я использовал TextView как целое представление только для простоты. Это работает с ViewGroups, такими как LinearLayouts, RelativeLayouts, пользовательские View с холстами и т. Д. Просто кажется, что WebViews особенные. (Я также получал ACTION_MOVE только при использовании WebView.) Итак, я надеюсь, что вы можете обойтись без использования WebView!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...