Android初学者:了解MotionEvent动作

时间:2010-04-09 16:27:11

标签: android

我无法让我的活动生成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 个答案:

答案 0 :(得分:12)

首先,您需要关注Webview tutorial,让WebViewClient代替默认浏览器完成工作。没有它,在您加载网页后,您根本不会得到任何事件。

假设您想要处理您的活动中的事件,您可以添加方法dispatchTouchEvent

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

您也会看到其他触摸事件。你应该用这种方法处理它们。

另一个approuch是注册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()可能会获得事件(见下文)
  5. 此外, onTouch()报告相对于视图, dispatchTouchEvent()报告相对于人机界面的值。

    为什么onTouchEvent不报告这些事件?像许多这些方法一样, onTouchEvent()有两个版本。

    如果您在Activity中覆盖onTouchEvent(),它将作为“全部捕获” - 它只处理视图未使用的事件,例如,如果您在任何视图之外点击,或事件传递这些观点。如果您在View中覆盖onTouchEvent(),它应该处理该视图中的事件。有时很容易混淆两者。

答案 1 :(得分:10)

您的问题是您是在WebView中执行此操作。 WebView具有内置的触摸控件,允许用户滚动页面,这必然会干扰您接收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,带有画布的自定义视图等。看起来WebViews很特别。 (我在使用WebView时也只接收ACTION_MOVE。)所以,我希望你可以使用除WebView以外的其他东西!

相关问题