[英]Android WebView: prevent double tap zoom
我希望能夠覆蓋doubleTap運動事件,而不是縮放和縮放。 我在另一篇文章中讀到,有人可以通過創建自定義WebView類並覆蓋其中的內容來使其工作,但是無論如何我似乎都無法觸發onDoubleTap,並且無論如何,雙擊縮放仍在發生這個。
到目前為止,我的進步是可以使onDown事件正常啟動(我在調試輸出窗口中看到了味精)。
這是我的代碼,並且在文章的最底部是指向當前有問題的演示項目版本的鏈接。
(main.xml)
<?xml version="1.0" encoding="utf-8"?>
<xonmp.hellowwebview.MyWebView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
(helloWebViewActivity.java)
package xonmp.hellowwebview;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import xonmp.cannedwebview.R;
import xonmp.hellowwebview.MyWebView;
public class HelloWebViewActivity extends Activity {
//private WebView mWebView;
private MyWebView mWebView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("We Got Here", "By here I mean onCreate");
//mWebView = (WebView) findViewById(R.id.webview);
mWebView = (MyWebView) findViewById(R.id.webview);
WebSettings config = mWebView.getSettings();
config.setJavaScriptEnabled(true);
config.setLoadWithOverviewMode(true);
config.setUseWideViewPort(true);
config.setBuiltInZoomControls(false);
config.setSupportZoom(false);
// config.setUserAgentString("android-client");
mWebView.loadUrl("http://www.google.com");
mWebView.setWebViewClient(new HelloWebViewClient());
}
private class HelloWebViewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView webview, String url){
webview.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
if ((keyCode == KeyEvent.KEYCODE_BACK)&& mWebView.canGoBack()){
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
但是我自己的MyWebView.java類仍然不能讓我鈎上onDoubleTab方法
(MyWebView.java)
package xonmp.hellowwebview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.webkit.WebView;
import android.widget.Toast;
class MyWebView extends WebView {
boolean doubleTap = false;
public MyWebView(Context context) {
super(context);
}
public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d("113133", "onTouchEvent Fired!");
if(true){
GestureDetector gd = new GestureDetector(sogl);
gd.onTouchEvent(event);
// disable double tap zooming
if(doubleTap){
doubleTap = false;
return false;
}
return super.onTouchEvent(event);
}
return super.onTouchEvent(event);
}/**/
GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
public boolean onDown(MotionEvent e){
Log.d("ohmygosh", "ohmygosh - onDown");
return false;
}
public boolean onDoubleTap(MotionEvent e) {
doubleTap = true;
Log.d("ohmygosh", "ohmygosh - onDoubleTap");
return false;
}
};/**/
/*
@Override
public boolean onTouchEvent(MotionEvent event){
Log.d("113133", "onTouchEvent Fired!");
//float myF = 9/0;
return true;
}/**/
}
這是github鏈接 (您可能需要將加載網址更改為類似google的名稱)。
非常感謝您的幫助!
編輯:我決定再次擺弄配置設置,我想出了一個可行的解決方案:
WebSettings config = mWebView.getSettings();
config.setJavaScriptEnabled(true);
//config.setLoadWithOverviewMode(true);
//config.setUseWideViewPort(true);
config.setBuiltInZoomControls(false);
config.setSupportZoom(false);
// config.setUserAgentString("android-client");
mWebView.setInitialScale(80);
我不完全知道setInitialScale的工作原理...我有一種不好的感覺,如果在另一頁上,事情的寬度與我在這里所寫的寬度不完全相同,它將被縮放錯誤。
您可以嘗試在Webview中禁用對縮放的支持嗎?
如果那不起作用,請檢查其他StackOverflow
如果可能,請替換html中的靜態元標記:
<script>
var meta = document.createElement("meta");
meta.setAttribute('name','viewport');
meta.setAttribute('content','width=device-width, user-scalable=no');
document.getElementsByTagName('head')[0].appendChild(meta);
</script>
另外,您可以使用一個不錯的腳本: FastClick
它不會等待點擊事件,因此速度更快。
<script type="application/javascript" src="fastclick.js"></script>
<script language="javascript">
window.addEventListener('load', function() {
FastClick.attach(document.body);
}, false);
</script>
然后將雙擊偵聽器設置為手勢檢測器。 (在自定義WebView中)
gestureDetector.setOnDoubleTapListener(new OnDoubleTapListener() {
@Override
public boolean onSingleTapConfirmed( MotionEvent e ) {
return false;
}
@Override
public boolean onDoubleTapEvent( MotionEvent e ) {
return true;
}
@Override
public boolean onDoubleTap( MotionEvent e ) {
return true;
}
});
重寫onTouchEvent方法(在自定義WebView中):
@Override
public boolean onTouchEvent( MotionEvent event ) {
boolean gestureHandled = gestureDetector.onTouchEvent(event);
int actionMask = event.getActionMasked() & MotionEvent.ACTION_MASK;
int index = ( event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pointId = event.getPointerId(index);
// ignore move events
if (actionMask == MotionEvent.ACTION_MOVE) {
return super.onTouchEvent(event);
}
// cancel detected double taps
if (gestureDetector.onTouchEvent(event)) {
event.setAction(MotionEvent.ACTION_CANCEL);
super.onTouchEvent(event);
return true;
}
// if you want to ignore multi touch events/taps
if (pointId != 0) {
System.out.println("KEY multiple points detected");
return true;
}
// use single taps
if (event.getAction() == MotionEvent.ACTION_UP) {
event.setAction(MotionEvent.ACTION_CANCEL);
super.onTouchEvent(event);
event.setAction(MotionEvent.ACTION_DOWN);
super.onTouchEvent(event);
event.setAction(MotionEvent.ACTION_UP);
return true;
}
return super.onTouchEvent(event);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.