Android monitorea la dirección de deslizamiento de la vista web y si se desliza hacia arriba o hacia abajo

Juzgar la dirección de deslizamiento de la vista web, una pregunta común, se menciona nuevamente.

Para monitorear si la vista web se desliza hacia abajo o hacia arriba, puede juzgar restableciendo onScrollChanged() o onTouchEvent() de la vista web.

Entre ellos, la dirección de deslizamiento de la vista web se puede determinar reescribiendo onTouchEvent().

Para decidir si se desliza hacia abajo, se compara la altura de la vista web con la altura de la vista web actual.

Juzgar si se desliza hacia arriba se obtiene evaluando getScrollY() == 0 de webview.

El primero es anular onScrollChanged(), que se pasa a la llamada externa a través de la devolución de llamada.

public class McWebViewScroll extends WebView {

    public McWebViewScroll(Context context) {
        super(context);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }


    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        // webview的高度
        float webcontent = getContentHeight() * getScale();
        // 当前webview的高度
        float webnow = getHeight() + getScrollY();

        if (Math.abs(webcontent - webnow) < 1) {
            //处于底端
            Log.e("测试","处于底端");

            if(mOnScrollChangeListener !=null){
                mOnScrollChangeListener.onPageEnd(l, t, oldl, oldt);
            }
        } else if (getScrollY() == 0) {
            //处于顶端
            Log.e("测试","处于顶端");
            if(mOnScrollChangeListener !=null){
                mOnScrollChangeListener.onPageTop(l, t, oldl, oldt);
            }
        } else {
            if(mOnScrollChangeListener !=null){
                mOnScrollChangeListener.onScrollChanged(l, t, oldl, oldt);
            }
        }
    }

    private OnScrollChangeListener mOnScrollChangeListener;

    public void setOnScrollChangeListener(OnScrollChangeListener listener) {
        this.mOnScrollChangeListener = listener;
    }

    public interface OnScrollChangeListener {

        public void onPageEnd(int l, int t, int oldl, int oldt);

        public void onPageTop(int l, int t, int oldl, int oldt);

        public void onScrollChanged(int l, int t, int oldl, int oldt);

    }



}

transferir:
 

        webView.setOnScrollChangeListener(object :McWebViewScroll.OnScrollChangeListener{
            override fun onPageEnd(l: Int, t: Int, oldl: Int, oldt: Int) {
                
            }

            override fun onPageTop(l: Int, t: Int, oldl: Int, oldt: Int) {
            }

            override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) {
            }

        })

La segunda es reescribir onTouchEvent() para determinar la dirección de deslizamiento y pasarla a la llamada externa a través de la devolución de llamada.

public class McWebViewScroll extends WebView {

    public McWebViewScroll(Context context) {
        super(context);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }
    

    public interface McEventListener {
        void onEventUp();
        void onEventDown();
        void onEventPageTop();
        void onEventPageEnd();
    }

    private McEventListener mEventListener;

    public void setMcEventListener(McEventListener listener) {
        mEventListener = listener;
    }

    private int lastScrollY;
    private boolean scrollFx = true;//true 向下滑 false 向上滑

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN:
                lastScrollY = this.getScrollY();

            case MotionEvent.ACTION_MOVE:
                if (Math.abs(lastScrollY - this.getScrollY()) > 10) {
                    if (lastScrollY > this.getScrollY()) {//向下滑
                        scrollFx = true;
                        Log.e("测试", "向下滑");
                    } else {//向上滑
                        scrollFx = false;
                        Log.e("测试", "向上滑");
                    }

                    lastScrollY = this.getScrollY();

                    if (scrollFx) {
                        Log.e("测试", "下滑 ");
                        if (mEventListener != null) {
                            mEventListener.onEventDown();
                        }
                        if (getScrollY() == 0){
                            Log.e("测试", "下滑 到头了");
                            if (mEventListener != null) {
                                mEventListener.onEventPageTop();
                            }
                        }
                    } else {
                        Log.e("测试", "上滑 ");
                        if (mEventListener != null) {
                            mEventListener.onEventUp();
                        }
//                    // webview的高度
//                    float webcontent = getContentHeight() * getScale();
//                    // 当前webview的高度
//                    float webnow = getHeight() + getScrollY();
                        if((this.getHeight() + this.getScrollY())>=(this.getContentHeight() * this.getScale())){
                            Log.e("测试", "上滑 到底了");
                            if (mEventListener != null) {
                                mEventListener.onEventPageEnd();
                            }
                        }
                    }
                }




            case MotionEvent.ACTION_UP:
                if (getScrollY() == 0){
                    Log.e("测试", "下滑 到头了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageTop();
                    }
                }
                
                if((this.getHeight() + this.getScrollY())>=(this.getContentHeight() * this.getScale())){
                    Log.e("测试", "上滑 到底了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageEnd();
                    }
                }
                break;
        }

        return super.onTouchEvent(ev);
    }


}

Entre ellos, reescribir onTouchEvent() puede juzgar la dirección de deslizamiento por cierto, scrollFx, verdadero deslizamiento hacia abajo, falso deslizamiento hacia arriba.

Para garantizar la precisión al juzgar si se desliza hacia abajo o hacia arriba, se vuelve a juzgar cuando MotionEvent.ACTION_UP levanta el dedo~~

            case MotionEvent.ACTION_UP:
                if (getScrollY() == 0){
                    Log.e("测试", "下滑 到头了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageTop();
                    }
                }

                if((this.getHeight() + this.getScrollY())>=(this.getContentHeight() * this.getScale())){
                    Log.e("测试", "上滑 到底了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageEnd();
                    }
                }

transferir:

        webView.setMcEventListener(object :McWebViewScroll.McEventListener{
            override fun onEventUp() {
            }

            override fun onEventDown() {
            }

            override fun onEventPageTop() {
            }

            override fun onEventPageEnd() {
            }

        })

fin--------------------------------------------


En la vista web anidada de SwipeRefreshLayout, a veces, cuando la parte superior de la vista web no se muestra por completo, deslizar hacia abajo evocará la actualización desplegable de SwipeRefreshLayout
.

Se puede usar para determinar si habilitar la actualización al juzgar si se desliza hacia la parte superior de la vista web ~

public class McWebViewScroll extends WebView {

    public McWebViewScroll(Context context) {
        super(context);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        //四个参数分别对应,当前水平滚动的距离,当前垂直滚动的距离,上一次水平滚动的距离,上一次垂直滚动的距离
        super.onScrollChanged(l, t, oldl, oldt);
        if (mScrollListener != null) {
            mScrollListener.onScrollChanged(t);
        }
    }

    public interface IScrollListener {
        void onScrollChanged(int scrollY);
    }

    private IScrollListener mScrollListener;

    public void setOnScrollListener(IScrollListener listener) {
        mScrollListener = listener;
    }
}

usar:

        mBinding.webWv.setOnScrollListener(object : McWebViewScroll.IScrollListener {
            override fun onScrollChanged(scrollY: Int) {
                if (scrollY == 0) {
                    //启用下拉刷新

                } else {
                    //禁止下拉刷新

                }
            }

        })

Supongo que te gusta

Origin blog.csdn.net/NewActivity/article/details/129555644
Recomendado
Clasificación