scrollview嵌套webView的底部出现空白和缩放冲突问题处理

来源:互联网 发布:shadowsockx for mac 编辑:程序博客网 时间:2024/04/30 04:03
项目中activity中的webView在scrollview嵌套fragment的子fragment中,设置webView可缩放时滑动冲突,缩放卡顿,大片空白现象......

1.大片空白==解决
//1)添加调用引用,便于Js调用本地重新测量尺寸webView.addJavascriptInterface(this,"App");
// 2)在onPageFinish中,添加Js注入webView.loadUrl("javascript:App.resize(document.body.getBoundingClientRect().height)");
//3)在当前类中添加调用方法,部分版本需要添加@JavaScriptInterface@JavascriptInterfacepublic void resize(final float height) {    getActivity().runOnUiThread(new Runnable() {        @Override        public void run() {            webView.setLayoutParams(new RelativeLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));        }    });}
2.滑动冲突,卡顿==解决方法重写WebView的方法, 也有人说可以用event.getPointerCount()>=2来判断是否为手势缩放从而使用
requestDisallowInterceptTouchEvent(true);来拦截事件,但是本人认为这是不全面的因为你缩放时也是可能要滑动webview来查看放大的内容的,这时候你不能要求用户都用2个以上手指去滑动吧?

/** * Created by ** on 2017/3/23. */public class MyWebView extends WebView {    private Context context;    private boolean isScroll = true;// webview 是否滚动    PointF downP = new PointF();    public MyWebView(Context context) {        super(context);    }    public MyWebView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyWebView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {       //判断是否分发,返回为true则不分发下去        return isScroll;    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                //webview被点击到,即可滑动                isScroll = true;                downP.x = event.getX();                downP.y = event.getY();                //通知父控件现在进行的是本控件的操作,不要对我的操作进行干扰                getParent().requestDisallowInterceptTouchEvent(true);                break;            case MotionEvent.ACTION_MOVE:                float lastY = event.getY(event.getPointerCount() - 1);                if (isBottom())//如果到达底部,先设置为不能滚动                    isScroll = false;                // 如果到达底部,但开始向上滚动手向下滑,那么webview可以滚动                if (isBottom() && (downP.y - lastY < 0))                    isScroll = true;                if (isTop())//滑到顶部不能再滑                    isScroll = false;                getParent().requestDisallowInterceptTouchEvent(isScroll);                break;            case MotionEvent.ACTION_CANCEL:            case MotionEvent.ACTION_UP:                isScroll = false;                getParent().requestDisallowInterceptTouchEvent(isScroll);                break;        }        return super.onTouchEvent(event);    }    /**     * 判断是否到WebView达底部     */    private boolean isBottom() {        // WebView的总高度        float contentHeight = getContentHeight() * getScale();        // WebView的现高度        float currentHeight = getHeight() + getScrollY();        // 之间的差距小于2便认为滑动到底部        return contentHeight - currentHeight < 1;    }    private boolean isTop() {        //当ScrollY为0是到达顶部        return getScrollY() == 0;    }}最近发现之前用以上方法解决的WebView问题是没出现了,但又发现一个新的问题:有时会有WebView加载显示不全,只显示以小段的情况;经测试发现跟处理空白问题的代码有关系,但一直没能从根本上解决;望有遇到过类似问题的朋友能分享经验或一同探讨!!!! 
参考: 一个简单的Demo带你彻底掌握解决View滑动冲突的办法   http://blog.csdn.net/tyk0910/article/details/53414299
android 关于Scrollview嵌套WebView 滑动问题
 http://www.apkbus.com/forum.php?mod=viewthread&tid=166155&highlight=%E5%B5%8C%E5%A5%97webview
重定位问题的解决 http://www.apkbus.com/blog-192385-59984.html
0 0
原创粉丝点击