android scrollview 嵌套 webview

这是去年在做邮件客户端的时候遇到的一个问题,scrolliew内嵌套webview导致的事件冲突;今天看代码的时候遇到了,特别记录下,思路是这样的,当手指事件被界面接收到时,是webview先拿到事件,然后判断是多指操作还是单手指操作,因为多手指是用来做webview的放大操作,而单手指可以用于scrollview的上下滑动,scrollview不能左右滑动,webview可以左右滑动;这样就可以从逻辑上区分开用户是想滑动,还是想放大,好了下面开始上代码;

package com.ruaho.echat.chatui.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.webkit.WebView;

/**
 * 扩展的WebView
 */
public class IWebView extends WebView {
    public IWebView(Context context) {
        super(context);
    }

    public IWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public IWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public HitTestResult getHitTestResult() {
        return super.getHitTestResult();
    }

    /**
     * 取得横向滚动宽度
     */
    public int getHorizontalScrollWidth() {
        return computeHorizontalScrollRange();
    }

    /**
     * 取得横向滚动高度
     */
    public int getVerticalScrollHeight() {
        return computeVerticalScrollRange();
    }

    public interface ITouch {
        void onTouchPointerSingle();
        void onTouchPointerMult();
    }

    private ITouch touch;
    public void setITouch(ITouch touch) {
        this.touch = touch;
    }

    float x1 = 0;
    float y1 = 0;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getPointerCount() >= 2) { //多点触控
            if (touch != null) {
                touch.onTouchPointerMult();
            }
        } else {
            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    x1 = event.getX();
                    y1 = event.getY();
                    break;
                case MotionEvent.ACTION_UP:
                    x1 = 0;
                    y1 = 0;
                    break;
                case MotionEvent.ACTION_MOVE:
                    float x2 = event.getX();
                    float y2 = event.getY();
                    if (x2 == x1 || Math.abs(y2 - y1) > Math.abs(x2 - x1)) { //竖直方向移动
                        if (touch != null) {
                            touch.onTouchPointerSingle();
                        }
                    } else {
                        if (touch != null) {
                            touch.onTouchPointerMult();
                        }
                    }
                    break;
            }

        }
        return super.onTouchEvent(event);
    }

    //是否拦截触摸事件
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }
}

上面是具体的自定义view,下面为用法

mail_content_webview.setITouch(new IWebView.ITouch() {
    @Override
    public void onTouchPointerSingle() {
        jump_bottom_scroll.requestDisallowInterceptTouchEvent(false);
    }

    @Override
    public void onTouchPointerMult() {
        jump_bottom_scroll.requestDisallowInterceptTouchEvent(true);
    }
});

插播广告:OTCBTC 是目前最流畅、最靠谱、最好用的场外交易平台,支持支付宝、微信、银行卡支付购买BTC、ETH、EOS、USDT、QTUM、ZEC、GXS、BCH 等数字币。现在注册,即可领取比特币红包! https://otcbtc.com/referrals/904529093

猜你喜欢

转载自blog.csdn.net/chen352602412/article/details/53423376