package com.hjq.md.widget;import android.annotation.SuppressLint;import android.content.Context;import android.os.Build;import android.support.annotation.RequiresApi;import android.support.v4.view.NestedScrollingChild;import android.support.v4.view.NestedScrollingChildHelper;import android.support.v4.view.ViewCompat;import android.util.AttributeSet;import android.view.MotionEvent;import android.webkit.WebView;/*** NestedScrollWebView*/public class NestedScrollWebView extends WebView implements NestedScrollingChild {private NestedScrollingChildHelper mChildHelper;private int mLastMotionY;private final int[] mScrollOffset = new int[2];private final int[] mScrollConsumed = new int[2];private int mNestedYOffset;private boolean mChange;public NestedScrollWebView(Context context) {super(context);init();}public NestedScrollWebView(Context context, AttributeSet attrs) {super(context, attrs);init();}public NestedScrollWebView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public NestedScrollWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);init();}public NestedScrollWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {super(context, attrs, defStyleAttr, privateBrowsing);init();}private void init() {if (mChildHelper == null) {mChildHelper = new NestedScrollingChildHelper(this);setNestedScrollingEnabled(true);}}@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean result = false;MotionEvent trackedEvent = MotionEvent.obtain(event);final int action = event.getActionMasked();if (action == MotionEvent.ACTION_DOWN) {mNestedYOffset = 0;}int y = (int) event.getY();event.offsetLocation(0, mNestedYOffset);switch (action) {case MotionEvent.ACTION_DOWN:mChange = false;mLastMotionY = y;startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);result = super.onTouchEvent(event);break;case MotionEvent.ACTION_MOVE:int deltaY = mLastMotionY - y;if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) {deltaY -= mScrollConsumed[1];trackedEvent.offsetLocation(0, mScrollOffset[1]);mNestedYOffset += mScrollOffset[1];}mLastMotionY = y - mScrollOffset[1];int oldY = getScrollY();int newScrollY = Math.max(0, oldY + deltaY);int dyConsumed = newScrollY - oldY;int dyUnconsumed = deltaY - dyConsumed;if (dispatchNestedScroll(0, dyConsumed, 0, dyUnconsumed, mScrollOffset)) {mLastMotionY -= mScrollOffset[1];trackedEvent.offsetLocation(0, mScrollOffset[1]);mNestedYOffset += mScrollOffset[1];}if(mScrollConsumed[1]==0 && mScrollOffset[1]==0) {if(mChange){mChange =false;trackedEvent.setAction(MotionEvent.ACTION_DOWN);super.onTouchEvent(trackedEvent);}else {result = super.onTouchEvent(trackedEvent);}trackedEvent.recycle();}else{if(!mChange){mChange = true;super.onTouchEvent(MotionEvent.obtain(0,0,MotionEvent.ACTION_CANCEL,0,0,0));}}//result = super.onTouchEvent(trackedEvent);//trackedEvent.recycle();break;case MotionEvent.ACTION_POINTER_DOWN:case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:stopNestedScroll();result = super.onTouchEvent(event);break;}return result;}// NestedScrollingChild@Overridepublic void setNestedScrollingEnabled(boolean enabled) {mChildHelper.setNestedScrollingEnabled(enabled);}@Overridepublic boolean isNestedScrollingEnabled() {return mChildHelper.isNestedScrollingEnabled();}@Overridepublic boolean startNestedScroll(int axes) {return mChildHelper.startNestedScroll(axes);}@Overridepublic void stopNestedScroll() {mChildHelper.stopNestedScroll();}@Overridepublic boolean hasNestedScrollingParent() {return mChildHelper.hasNestedScrollingParent();}@Overridepublic boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);}@Overridepublic boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);}@Overridepublic boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);}@Overridepublic boolean dispatchNestedPreFling(float velocityX, float velocityY) {return mChildHelper.dispatchNestedPreFling(velocityX, velocityY);}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。