我无法让我的活动生成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(),它应该处理该视图中的事件.有时很容易混淆两者.
首先,您需要按照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(),它应该处理该视图中的事件.有时很容易混淆两者.
您的问题是您是在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之外的其他东西!