简体   繁体   English

Android禁用WebView触摸但保持缩放/滚动

[英]Android disable WebView touch but keep zooming/scrolling

我正在寻找一种方法来禁用WebView上的触摸,因此用户无法点击html链接,但保留了WebView的缩放和滚动功能。

the code below allow you scroll but when click at the link it won't go to next page. 下面的代码允许您滚动,但点击链接时它不会转到下一页。

webView.setLongClickable(false);

webView.setOnTouchListener(new View.OnTouchListener()
{

  @Override

  public boolean onTouch(View arg0, MotionEvent arg1)
  {

       return arg1.getAction() == MotionEvent.ACTION_UP;

  }
}

);
Webview.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {      
                    return false;
        }
});

I used rattisuk's answer at fist but realized that if you click somewhere, the click gets intercepted but turns into a long click, making the phone vibrate and also poping some potential edition menu if you clicked on some text field. 我在拳头上使用了rattisuk的答案,但意识到如果你点击某个地方,点击会被拦截但变成长按,使手机振动,如果点击某个文字字段,还会弹出一些潜在的编辑菜单。 Also whenever pressing on changeable UI elements in the webview (clicking on a link or a button for example), those UI elements would change appearance. 此外,每当按下webview中的可更改UI元素(例如,单击链接或按钮)时,这些UI元素将改变外观。 To prevent that, here is my improved solution : 为了防止这种情况,这是我改进的解决方案:

// Disable the haptic feedback so that handling the long click doesnt make the phone vibrate
webview.setHapticFeedbackEnabled(false);
// Intercept long click events so that they dont reach the webview
webview.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(final View v) {
        return true;
    }
});
// Intercept any touch event not related to scrolling/zooming
webview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // Change ACTION_DOWN location to outside of the webview so that it doesnt affect 
            // pressable element in the webview (buttons receiving PRESS" will change appearance)
            event.setLocation(webview.getWidth() + 1, webview.getHeight() + 1);
        }
        // Intercept any "up" event
        return event.getAction() == MotionEvent.ACTION_UP;
    }
});

Here is my solution. 这是我的解决方案。 It does not let a user trigger javascript click events 它不会让用户触发javascript点击事件

public class NonClickableWebView extends WebView {
    private GestureDetectorCompat gestureDetector;
    private boolean isSingleTap = false;

    public NonClickableWebView(Context context) {
        super(context);
        gestureDetector = new GestureDetectorCompat(context, new GestureDetector());
    }

    public NonClickableWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        gestureDetector = new GestureDetectorCompat(context, new GestureDetector());
    }

    public NonClickableWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        gestureDetector = new GestureDetectorCompat(context, new GestureDetector());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            isSingleTap = false;
        }
        gestureDetector.onTouchEvent(event);

        if (isSingleTap && event.getAction() == MotionEvent.ACTION_UP) {
            return true;
        }

        return super.onTouchEvent(event);
    }

    private class GestureDetector extends android.view.GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            isSingleTap = true;
            return false;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            isSingleTap = true;
            return false;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM