1. 程式人生 > >android scrollview 巢狀 webview

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