Android 自定义WebView 实现 NestedScrollingChild
2016-12-31 15:49
543 查看
有时候我们需要webview实现NestedScrollingChild那样的功能,原生webview不支持,只能通过自定义webview实现NestedScrollingChild接口来实现。
由于本人自定义view水平有限,实现不了该功能。好在国外的大神Tobias Rohloff 实现了该功能,在此谢谢他。
详细代码如下:
源码地址请点击这里哦
由于本人自定义view水平有限,实现不了该功能。好在国外的大神Tobias Rohloff 实现了该功能,在此谢谢他。
详细代码如下:
/* * Copyright (C) 2016 Tobias Rohloff * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.tobiasrohloff.view; import android.content.Context; import android.support.v4.view.MotionEventCompat; 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; public class NestedScrollWebView extends WebView implements NestedScrollingChild { public static final String TAG = NestedScrollWebView.class.getSimpleName(); private int mLastMotionY; private final int[] mScrollOffset = new int[2]; private final int[] mScrollConsumed = new int[2]; private int mNestedYOffset; private NestedScrollingChildHelper mChildHelper; 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(); } private void init() { mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } @Override public boolean onTouchEvent(MotionEvent event) { boolean result = false; MotionEvent trackedEvent = MotionEvent.obtain(event); final int action = MotionEventCompat.getActionMasked(event); if (action == MotionEvent.ACTION_DOWN) { mNestedYOffset = 0; } int y = (int) event.getY(); event.offsetLocation(0, mNestedYOffset); switch (action) { case MotionEvent.ACTION_DOWN: 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]; } int oldY = getScrollY(); mLastMotionY = y - mScrollOffset[1]; if (deltaY < 0) { int newScrollY = Math.max(0, oldY + deltaY); deltaY -= newScrollY - oldY; if (dispatchNestedScroll(0, newScrollY - deltaY, 0, deltaY, mScrollOffset)) { mLastMotionY -= mScrollOffset[1]; trackedEvent.offsetLocation(0, mScrollOffset[1]); mNestedYOffset += mScrollOffset[1]; } } trackedEvent.recycle(); result = super.onTouchEvent(trackedEvent); break; case MotionEvent.ACTION_POINTER_DOWN: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: stopNestedScroll(); result = super.onTouchEvent(event); break; } return result; } // NestedScrollingChild @Override public void setNestedScrollingEnabled(boolean enabled) { mChildHelper.setNestedScrollingEnabled(enabled); } @Override public boolean isNestedScrollingEnabled() { return mChildHelper.isNestedScrollingEnabled(); } @Override public boolean startNestedScroll(int axes) { return mChildHelper.startNestedScroll(axes); } @Override public void stopNestedScroll() { mChildHelper.stopNestedScroll(); } @Override public boolean hasNestedScrollingParent() { return mChildHelper.hasNestedScrollingParent(); } @Override public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); } @Override public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); } @Override public boolean dispatchNestedPreFling(float velocityX, float velocityY) { return mChildHelper.dispatchNestedPreFling(velocityX, velocityY); } }
源码地址请点击这里哦
相关文章推荐
- Android 自定义WebView 实现 NestedScrollingChild
- WebView 实现 NestedScrollingChild
- android 腾讯微博分享功能实现及自定义webview认证
- 如何实现自定义的android WebView错误页
- Android嵌套滚动Demo-NestedScrollingChild实现
- Android从零开搞系列:自定义View(7)ScrollTo+ScrollBy+Scroller+NestedScrolling机制(下)
- Android自定义的webView——可实现的网页文本的复制
- Android从零开搞系列:自定义View(6)ScrollTo+ScrollBy+Scroller+NestedScrolling机制(上)
- Android WebView自定义长按选择实现收藏/分享选中文本功能
- Android-NestedScrollingParent, NestedScrollingChild父子View 间 的 嵌套滑动
- Android自定义WebView实现Youtube网络视频播放控件
- 【Android】 切换Webview与自定义的界面实现
- Android TextView 自定义识别文本中的超链接并打开自身WebView(按照微信效果实现)
- 【Android】自定义ScrollingTabs结合ViewPager实现指引的效果
- android 腾讯微博分享功能实现及自定义webview认证
- android 利用ViewDragHelper实现childView可随手指移动的自定义ViewGroup
- 在Android中,可以自定义类,继承ViewGroup等容器类,以实现自己需要的布局显示。
- android之自定义ViewGroup和自动换行的布局的实现
- Android在自定义View(SurfaceView)中实现进度条Progress
- 使用WebView实现新浪微博Oauth2.0认证(android)