(原创)巧妙解决ViewPager和ScrollView冲突

本文介绍了一种简单方法来解决Android开发中ViewPager与ScrollView的滑动冲突问题。通过重写ScrollView并调整事件分发机制,使得两个控件可以和谐共存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直以来,Viewpager和ScrollView总像是一对冤家不能共存
而为了解决这个问题许许多多的程序员们也想了很多的办法
今天就来说一个比较简单的
首先说说原理吧
这两个控件之所以冲突其实还是因为一个叫做"事件分发"的机制的存在
要解决这个问题,首先需要改写ScrollView
即在触摸事件拦截器里面进行判断,
如果横着滑动的距离大于竖着滑动的距离,
就让事件分发的方法返回false
也就是不拦截当前事件,传递给下一层执行
以下是我自己重写的ScrollView,分享给大家
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;


public class MyScrollView extends ScrollView{

    private float xDistance;
    private float yDistance;
    private float xLast;
    private float yLast;

    public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

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

    /**
     * 在该方法中进行判断
     * @param ev
     * @return
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0.0f;
                xLast = ev.getX();
                yLast = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();

                xDistance += Math.abs(curX - xLast);
                yDistance += Math.abs(curY - yLast);

                if(xDistance > yDistance)
                    return false;

                break;
            default:
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值