这是去年在做邮件客户端的时候遇到的一个问题,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