Android(安卓)ScrollView嵌套WebView
16lz
2021-01-24
Android中WebView用来加载html页面,自带滑动效果。ScrollView同样也是自带滑动效果,在项目中如果需要WebView和一些其他view比如TextView一起滑动的话就必须外面嵌套一层ScrollView,这时问题就来了,嵌套之后ScrollView的滑动和WebView的滑动就会有冲突,WebView的滑动不流畅。下面就是解决方案:
第一种方法:我们都知道ScrollView和WebView都有滚动的效果,所以我们需要先屏蔽WebView的滚动事件。
这时候如果后端如果传过来的不是完整的Html,而是只有body部分的内容,那么我们就需要补充并添加一些css样式来达到自适应的效果。
private String getHtmlData(String bodyHTML) { String head = "" + " " + "" + ""; return "" + head + "" + bodyHTML + "";}
4.0以后引用:
Webview.loadDataWithBaseURL("example-app://example.co.uk/", getHtmlData(String bodyHTML), null, "UTF-8",null);
第二种方法:自定义一个ScrollView
import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.widget.ScrollView;/** * Created by Administrator on 2015/12/29 0029. */public class MyScrollView extends ScrollView {// private GestureDetector mGestureDetector;// View.OnTouchListener mGestureListener;//// public MyScrollView(Context context, AttributeSet attrs) {// super(context, attrs);// mGestureDetector = new GestureDetector(context, new YScrollDetector());// setFadingEdgeLength(0);// }//// @Override// public boolean onInterceptTouchEvent(MotionEvent ev) {// return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);// }//// // Return false if we're scrolling in the x direction// class YScrollDetector extends GestureDetector.SimpleOnGestureListener {// @Override// public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {// if (Math.abs(distanceY) > Math.abs(distanceX)) {// return true;// }// return false;// }// } /** */ public ScrollView parentScrollView; public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } private int lastScrollDelta = 0; public void resume() { overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0, 0, true); lastScrollDelta = 0; } int mTop = 10; /** * 将targetView滚到最顶端 */ public void scrollTo(View targetView) { int oldScrollY = getScrollY(); int top = targetView.getTop() - mTop; int delatY = top - oldScrollY; lastScrollDelta = delatY; overScrollBy(0, delatY, 0, getScrollY(), 0, getScrollRange(), 0, 0, true); } private int getScrollRange() { int scrollRange = 0; if (getChildCount() > 0) { View child = getChildAt(0); scrollRange = Math.max(0, child.getHeight() - (getHeight())); } return scrollRange; } int currentY; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (parentScrollView == null) { return super.onInterceptTouchEvent(ev); } else { if (ev.getAction() == MotionEvent.ACTION_DOWN) {// 将父scrollview的滚动事件拦截 currentY = (int)ev.getY(); setParentScrollAble(false); return super.onInterceptTouchEvent(ev); } else if (ev.getAction() == MotionEvent.ACTION_UP) {// 把滚动事件恢复给父Scrollview setParentScrollAble(true); } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { } } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { View child = getChildAt(0); if (parentScrollView != null) { if (ev.getAction() == MotionEvent.ACTION_MOVE) { int height = child.getMeasuredHeight(); height = height - getMeasuredHeight();// System.out.println("height=" + height); int scrollY = getScrollY();// System.out.println("scrollY" + scrollY); int y = (int)ev.getY();// 手指向下滑动 if (currentY < y) { if (scrollY <= 0) {// 如果向下滑动到头,就把滚动交给父Scrollview setParentScrollAble(true); return false; } else { setParentScrollAble(false); } } else if (currentY > y) { if (scrollY >= height) {// 如果向上滑动到头,就把滚动交给父Scrollview setParentScrollAble(true); return false; } else { setParentScrollAble(false); } } currentY = y; } } return super.onTouchEvent(ev); } /** * 是否把滚动事件交给父scrollview * * @param flag */ private void setParentScrollAble(boolean flag) { parentScrollView.requestDisallowInterceptTouchEvent(!flag); }}
注意:使用后发现webView加上 android:layerType="software"
之后,有时候加载不出来数据,而且加载数据很慢。所以可以去掉。感谢点击打开链接 webview常见问题汇总http://blog.csdn.net/t12x3456/article/details/13769731
更多相关文章
- TextView使用android:autoLink="web"但又不打算跳转外部浏览器
- 【Android(安卓)界面效果10】Android中View,ViewGroup,Window之
- Android之RxJava(一)
- Android(安卓)浮动视图效果 第三种实现方式
- Android(安卓)density与显示效果总结
- 【较详细】Andriod 从源码的角度详解View,ViewGroup的Touch事件
- android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K
- Android基于API的Tabs3实现仿优酷tabhost效果实例
- android动效开篇