- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个使用内置缩放控件的 webview,如下所示:
wv = new WebView(this);
wv.getSettings().setBuiltInZoomControls(true);
注意:这会激活两个主要功能 - 双指缩放和 invokeZoomPicker()(后者仅在 View 上完成滑动操作时调用,简单的触摸不会启用它)
我还希望在触摸事件发生时发生一些事情,使用以下内容
wv.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.i("touch", "touched!");
return false;
}
});
当 WebView 加载时,我点击屏幕,每次与屏幕交互时,日志都会显示“已触摸”,正如预期的那样。但是,如果我做了一些会触发 invokeZoomPicker() 的事情(捏合缩放似乎不会导致这个问题,只要缩放小部件没有出现),onTouchListener 就会停止响应我的点击(即使在几秒钟后) ,当小部件从 View 中消失时)。
为确保它是 invokeZoomPicker(),我按如下方式编辑了代码的第二段:
wv.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
wv.invokeZoomPicker();
Log.i("touch", "touched!");
return false;
}
});
这个新的 onTouch 方法现在只触发一次(因此 zoomwidget 出现在 View 上 - 几秒钟后消失),然后 onTouch 方法不会被再次调用,直到 View 被重新加载 - 所以这绝对是 invokeZoomPicker()/Zoom 小部件的问题
我是否错过了一些允许它们共存的重要代码,或者我只能选择我可以没有的代码?
最佳答案
因此,在我自己遇到同样的问题后,我试图理解其中一些答案,但无济于事。手头的问题是,一旦用户调用滚动(不是双指缩放)(至少对我而言……),WebView 实例就会丢失其 OnTouchListener 引用。我是怎么想出来的?嗯……
Webview 继承自View 的dispatchTouchEvent()。dispatchTouchEvent 调用 onTouch()(这是应该触发的函数)
没有调用 onTouch() 的原因,如我之前所说,WebView 实例的 OnTouchListener 出于某种原因被设置为 null。这个可以在View的dispatchTouchEvent()方法中打断点看
为了解决这个问题,我们像这样扩展 WebView:
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
public class TouchWebView extends WebView {
WebTouchListener wtl;
public TouchWebView(Context context) {
super(context);
}
public TouchWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public TouchWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void resetTouchListener() {
if(this.wtl == null) {
this.wtl = new WebTouchListener();
}
this.setOnTouchListener(wtl);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
this.resetTouchListener();
return super.dispatchTouchEvent(event);
}
}
然后我们实现我们的 OnTouchListener:
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.webkit.WebView;
public class WebTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
WebView.HitTestResult hr = ((TouchWebView)v).getHitTestResult();
//Log.i(TAG, "getExtra = "+ hr.getExtra() + "\t\t Type=" + hr.getType());
if (event.getAction() == MotionEvent.ACTION_DOWN) {
System.out.println(hr.getExtra() + " " + hr.getType());
}
// TODO Auto-generated method stub
return false;
}
}
OnTouch 现在即使在缩放或滚动后也会触发
关于android: ZoomPicker 中断了 onTouchListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4529093/
我有一个使用内置缩放控件的 webview,如下所示: wv = new WebView(this); wv.getSettings().setBuiltInZoomControls(true); 注
我是一名优秀的程序员,十分优秀!