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);    }}



之后就在自己的xml布局文件里用MyScrollView代替ScrollView来布局就ok了。如:
                                                                    
注意:使用后发现webView加上
android:layerType="software"
之后,有时候加载不出来数据,而且加载数据很慢。所以可以去掉。感谢点击打开链接

webview常见问题汇总http://blog.csdn.net/t12x3456/article/details/13769731




更多相关文章

  1. TextView使用android:autoLink="web"但又不打算跳转外部浏览器
  2. 【Android(安卓)界面效果10】Android中View,ViewGroup,Window之
  3. Android之RxJava(一)
  4. Android(安卓)浮动视图效果 第三种实现方式
  5. Android(安卓)density与显示效果总结
  6. 【较详细】Andriod 从源码的角度详解View,ViewGroup的Touch事件
  7. android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K
  8. Android基于API的Tabs3实现仿优酷tabhost效果实例
  9. android动效开篇

随机推荐

  1. 如何将A表查出来的数据放到B表中
  2. 存款日均额计算的SQL语句如何书写
  3. SQLSERVER中的假脱机spool
  4. [超入门]使用docker做mysql主从复制实验
  5. laravel原生MySQL之Group记录
  6. 高分求解:如何每天将本地的sybase的数据导
  7. MySQL 5.7.22 免安装配置
  8. MySQL数据库阶段学习目录
  9. 临时表空间、drop、truncate、delete的区
  10. SQL SERVER 2005 数据库对比工具,并自动生