欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决在ScrollView中使用固定高度的WebView的冲突

程序员文章站 2022-06-08 17:56:33
...

**

解决在ScrollView中使用固定高度的WebView的冲突

**

废话不多说直接上代码,看注释

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;

/**
 * WebView固定高度
 * 解决webview在ScrollView里面的滑动冲突
 */
public class ScrollWebView extends WebView {

    /**
     * 手指按下的y坐标
     */
    private int downY = 0;

    /**
     * 外部可以滚动的ViewGroup
     */
    private ViewGroup parentView;

    public ScrollWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            //手指按下的时候记录y
            downY = (int) event.getRawY();
        }
        callback.callback(this, event);
        return super.onTouchEvent(event);
    }

    /**
     * true 向上滑动 false 表示正在向下滑动
     *
     * @param event
     * @return
     */
    public boolean isMoveUp(MotionEvent event) {
        int y = (int) event.getRawY();
        if (y > downY) {
            return true;
        }
        return false;
    }

    /**
     * 在外面设置parentView   要可以滚动的
     *
     * @param parentView
     */
    public void setParentView(ViewGroup parentView) {
        this.parentView = parentView;
    }

    /**
     * 回调执行的具体内容
     */
    Callback callback = new Callback() {
        @Override
        public void callback(View v, MotionEvent event) {
            //手指UP操作的时候 停止WebView的触摸事件
            if (event.getAction() == MotionEvent.ACTION_UP) {
                //返回false表是停止WebView的触摸事件 true开始WebView的触摸事件
                parentView.requestDisallowInterceptTouchEvent(false);
            } else {
                boolean isTop = canScrollVertically(-1);//false 表示到达顶部
                boolean isBottom = canScrollVertically(1);//false 表示到达底部
                if (!isTop) {
                    if (isMoveUp(event)) parentView.requestDisallowInterceptTouchEvent(false);
                    else parentView.requestDisallowInterceptTouchEvent(true);
                } else if (!isBottom) {
                    if (!isMoveUp(event)) parentView.requestDisallowInterceptTouchEvent(false);
                    else parentView.requestDisallowInterceptTouchEvent(true);
                } else {
                    parentView.requestDisallowInterceptTouchEvent(true);
                }
            }
        }
    };

    /**
     * 回调
     */
    public interface Callback {
        void callback(View v, MotionEvent event);
    }
}

复制了可以直接使用

注意setParentView方法最好在WebView.loadUrl前调用 不然可能会报空指针异常

您的回复是我最大的动力