android 滑动冲突 ScrollView Viewpager listview 等

本文介绍了一种解决ScrollView嵌套ViewPager时出现的滑动冲突问题的优化方法,通过调整ScrollView的滑动手势检测逻辑,有效避免了上下滑动卡顿的情况。同时,还提供了解决ListView中横向滑动的另一种方法。本文详细解释了实现步骤,并通过代码实例展示了如何在XML文件中引用优化后的ScrollView组件。

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

基本都是参考别人的东西,没做大的改动,只是整合了一下一些类似的东西,如下


现在查找ScrollView中带有Viewpager滑动冲突的,很多都copy的下面这个,我也用了一段时间,发现这个有一点小问题,就是有些时候上下滑动会卡住,后来又去找了一些,发现了一个新的,目前用的就是下面的那个,虽然还是有点不尽如人意,但是也可以满足大部分需求了,至于如何使用(新手看一下了),在你要引用它的xml文件里,使用com.xx.xx.ScrowViewWithViewpager来代替原本的scrollview就可以了,


另外还有listview中横向滑动则有另外的方法,也写在下面了


这个偶尔会卡住

public class ScrollViewWithViewpagerextends ScrollView{

/**

* 解决ScrollView嵌套ViewPager出现的滑动冲突问题

*/

    publicstatic booleancanScroll;

 

    private GestureDetectormGestureDetector;

    View.OnTouchListener mGestureListener;

   

    floatxDistance,yDistance,xLast,yLast;

 

    publicScrollViewWithViewpager(Context context, AttributeSet attrs) {

        super(context, attrs);

        mGestureDetector =new GestureDetector(new YScrollDetector());

        canScroll =true;

    }

    @Override

    publicboolean onInterceptTouchEvent(MotionEvent event) {


        if(event.getAction() == MotionEvent.ACTION_UP){

            canScroll =true;

        }

        returnsuper.onInterceptTouchEvent(event) && mGestureDetector.onTouchEvent(event);

    }

 

    class YScrollDetectorextends SimpleOnGestureListener {

        @Override

        publicboolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {

    if(canScroll)

                if (Math.abs(distanceY) < Math.abs(distanceX)){

                    canScroll = false;

                }else{

                    canScroll = true;

                }

            returncanScroll;

        }

    }

}


下面这种方法,是不会卡住了

    float xDistance,yDistance,xLast,yLast;

 

    public ScrollViewWithViewpager(Context context, AttributeSet attrs) {

        super(context, attrs);

    }


  @Override  

    publicboolean onInterceptTouchEvent(MotionEvent ev) {  

        switch (ev.getAction()) {  

            case MotionEvent.ACTION_DOWN:  

                xDistance = yDistance = 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);  

                xLast = curX;  

                yLast = curY;  

                 

                if(xDistance > yDistance){  

                    return false;  

                }    

        }  

 

        returnsuper.onInterceptTouchEvent(ev);  

    }  



listview中布局的横向滑动


listview.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View arg0, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_UP) {

canScroll =false;

    }

returncanScroll;

}

});


adapter中的view

view.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

if(event.getAction()==MotionEvent.ACTION_CANCEL) {

canScroll =false;

}else{

canScroll =true;

}

return true;

}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值