当前位置:  开发笔记 > 编程语言 > 正文

Android初学者:了解MotionEvent动作

如何解决《Android初学者:了解MotionEvent动作》经验,为你挑选了2个好方法。

我无法让我的活动生成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_mt.. 12

首先,您需要按照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 {

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;

}

从我的日志中我得到以下内容:

    首先调用dispatchTouchEvent()

    然后onTouch()被调用

    然后View获取事件来处理它

    然后onTouchEvent()可能会获得事件(见下文)

此外,onTouch()报告相对于View,dispatchTouchEvent()报告相对于Display的值.

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

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



1> rgr_mt..:

首先,您需要按照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 {

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;

}

从我的日志中我得到以下内容:

    首先调用dispatchTouchEvent()

    然后onTouch()被调用

    然后View获取事件来处理它

    然后onTouchEvent()可能会获得事件(见下文)

此外,onTouch()报告相对于View,dispatchTouchEvent()报告相对于Display的值.

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

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



2> Steve Haley..:

您的问题是您是在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之外的其他东西!

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有