gpt4 book ai didi

android: ZoomPicker 中断了 onTouchListener

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:39 27 4
gpt4 key购买 nike

我有一个使用内置缩放控件的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com