当前位置: 首页 > 知识库问答 >
问题:

Android网页视图:防止双击缩放

通寂离
2023-03-14

我希望能够覆盖 doubleTap 运动事件,使其不执行任何操作,而不是缩放和取消缩放。我在另一篇文章中读到,有人能够通过创建自定义WebView类并覆盖其中的内容来使其工作,但是无论如何,我似乎都无法在DoubleTap上启动,并且无论如何双击缩放仍在发生。

到目前为止,我的进展是我可以正确触发onDown事件(我在调试输出窗口中看到了msg)。

这是我的代码,在我帖子的最底部有一个链接,指向我的演示项目的版本,该版本目前有问题。

(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类仍然不允许我钩住双倍标签方法

(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链接(您可能需要将加载url更改为类似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);

不过,我不知道setLaunalScale是如何工作的…我有一种不好的感觉,如果在另一个页面上的东西与我这里的宽度不完全相同,它就会变焦错误。

共有2个答案

牛昱
2023-03-14

如果可能,替换html中的静态meta标签:

<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>

此外,你可以使用一个不错的脚本: 快速点击
它不会等待点击事件,所以它更快。

<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;
    }
});

重写“在”触摸事件“方法(在自定义 Web 视图中):

@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);
}
惠凯歌
2023-03-14

您能否尝试在Webview中禁用缩放支持?

如果这不起作用,请检查这个其他堆栈溢出

 类似资料:
  • 本文向大家介绍php防止CC攻击代码 php防止网页频繁刷新,包括了php防止CC攻击代码 php防止网页频繁刷新的使用技巧和注意事项,需要的朋友参考一下 网页快速恶意刷新,cc攻击就是攻击者利用代理服务器生成指向目标站点的合法请求,模拟多用户不停的对受害网站进行访问,特别是访问那些需要大量数据操作需要大量CUP时间的页面,最终导致目标网站服务器资源耗尽,一直到宕机崩溃,如此一来,造成服务器资源的

  • 问题内容: 经过一番工作后,我的路线申请工作正常。我唯一想添加的就是双击放大功能,但我不知道如何操作。 你能给我一个提示吗? 问题答案: 实现GestureListener来接收doubleTap事件。

  • 问题内容: 在angular中,我们可以设置一个按钮来发送ajax请求,如下所示: 并在控制器中: 因此,为防止重复提交,我可以在单击按钮时将标志设置为buttonclicked = true,而在ajax回调完成时将其取消设置。但是,即使这样,控制权仍会归还给有角力的人,他们将更新Dom。这意味着有一个很小的窗口,在原始按钮单击完全100%完成之前,可以再次单击该按钮。 这是一个小窗口,但仍然可

  • 问题内容: 如果使用“ fill_parent”或“ weight”拉伸视图或按钮,如何防止在ImageView或ImageButton中自动缩放位图? 例如,这将在屏幕顶部创建一个等距分布的4按钮工具栏时很有用,但是即使我使用scaleType =“ center”,按钮内部的图像也会不断拉伸,这应该避免根据文档缩放,但事实并非如此。 任何见解表示赞赏! 谢谢, 问题答案: 我发现使用andro

  • 问题内容: 我有一个使用自定义RowSorter可排序列的JTable。我假设RowSorter类自动将自身作为MouseListener添加到表的ColumnHeader中,因为它无需执行任何自定义鼠标侦听代码即可自动执行排序。这很完美。 我还添加了一些代码(基于此示例),该代码允许用户通过双击列标题中的表之间的空间来调整表列的大小(模仿Excel的行为)。问题是,当用户双击标题以调整列的大小时

  • 问题内容: 我正在尝试从gridview项内的按钮启动活动,这意味着 当用户单击gridview项时,它应该执行一项功能,而当 用户单击gridview项内的按钮时,它应该执行另一项 功能,让我详细说明一下,这是我的单个项目布局,正在 我的gridview中填充; here is how the above layout looks: and here is my adapter from whe