【问题标题】:Android beginner: understanding MotionEvent actionsAndroid 初学者:了解 MotionEvent 动作
【发布时间】:2011-02-06 05:41:29
【问题描述】:

我无法让我的活动生成 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;
  }

}

【问题讨论】:

  • rgr-mtsuggested edit 中指出“3 的 int 值是 ACTION_CANCEL,您的意思是 2 (ACTION_MOVE)”

标签: android


【解决方案1】:

首先,您需要按照Webview tutorialWebViewClient 而不是默认浏览器完成这项工作。没有它,在您加载网页后,您根本不会收到任何事件。

假设您要处理活动中的事件,您可以添加方法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 {

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() 报告相对于 View,dispatchTouchEvent() 报告相对于 Display 的值。

为什么 onTouchEvent 不报告这些事件?与许多这些方法一样,onTouchEvent() 也有两种形式。

如果您在 Activity 中覆盖 onTouchEvent(),它将充当“包罗万象” - 它仅处理视图未使用的事件,例如,如果您在任何视图之外点击,或者这些视图的事件传下去。如果您在视图中覆盖onTouchEvent(),它应该处理该视图中的事件。有时很容易将两者混淆。

【讨论】:

    【解决方案2】:

    您的问题是您在 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、带有画布的自定义 Views 等。看起来 WebViews 很特别。 (在使用 WebView 时,我也只收到 ACTION_MOVE。)所以,我希望你可以不使用 WebView 以外的东西!

    【讨论】:

    • 哇,感谢您的回复!它使事情变得更加复杂,但至少它会起作用! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多