我无法让我的活动生成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;
}
}
答案 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;
}
从我的日志中我得到以下内容:
此外, 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以外的其他东西!