解决coordinatorlayout嵌套webView遇到的问题
来源:互联网 发布:人工智能动作电影 编辑:程序博客网 时间:2024/04/29 08:55
一、介绍
在符合material desin设计中,我们的内容详情页通常会需要webview实现NestedScrollingChild那样的功能,原生webview不支持,但是嵌套在NestedScrollView里面,我们加载网页内部的很多js功能都无法实现了,只能通过自定义webview实现NestedScrollingChild接口来实现。
国外的大神Tobias Rohloff 实现了该功能,在此谢谢他。
然而他的有太多bug,对这个进行一些更改:
二、具体实现
/** * Created by * mi on 2017/7/21. */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]; 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]; } if(mScrollConsumed[1]==0 && mScrollOffset[1]==0) { 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); }}
3、应用
<com.kkeji.news.client.view.webview.NestedScrollWebView app:layout_behavior="@string/appbar_scrolling_view_behavior" android:id="@+id/content_WebView" android:layout_width="match_parent" android:layout_height="match_parent" />
四、一些要注意的问题:
实践发现,如果网页内部有a标签存在时
1、href属性不能为“#”,否则会返回顶部,在webview里面没有这个问题存在。
2、NestedScrollWebView要写在最外层才会生效,这关系到与coordinatorlayout之间的协调。
阅读全文
0 1
- 解决coordinatorlayout嵌套webView遇到的问题
- 解决ListView嵌套ListView遇到的问题
- ScrollView 嵌套 WebView 遇到的一些界面问题总结
- 解决SpringView与CoordinatorLayout和AppBarLayout嵌套使用的上下滑动冲突问题
- webview遇到的问题
- [开发总结]WebView使用中遇到的一些问题&解决
- android :webview 解决遇到的跨域问题
- [开发总结]WebView使用中遇到的一些问题&解决
- [Android开发] WebView遇到的问题以及解决
- ListView嵌套webView滑动冲突的解决
- 遇到的webview的问题
- CoordinatorLayout嵌套AppBarLayout的使用
- android里面嵌套WebView,解决 WebView点击无效的方法
- 使用webview遇到的问题
- CoordinatorLayout实现上滑隐藏ToolBar遇到的问题
- CoordinatorLayout+TabLayout在Fragment中使用遇到的问题
- 解决小米系统下ViewPager、ScrollView内嵌套WebView时,Touch事件不响应的问题
- ViewPager嵌套WebView出现的问题
- SimpleDateFormat 使用TimeZone
- Android中怎么计算apk的启动时间
- Tree-----173. Binary Search Tree Iterator(实现一个迭代器接口)
- 记录下java进制转换方式
- 周的开始和结束时间
- 解决coordinatorlayout嵌套webView遇到的问题
- 通过git关于分支的简单操作
- Servlet的生命周期
- jquery 常用方法
- DRDS性能评估分析
- 设计模式(11) 桥接模式(简单入门 结构模式)
- IOS地图自定义弹出框
- Log4J的配置
- python多线程