ViewPager设置setPageTransformer后RecyclerView垂直滑动问题

viewPager设置setPageTransformer后RecyclerView垂直滑动问题中。

处理方法:

在垂直滑动中禁止viewpager滑动

viewPager.setPageTransformer(false, new CustPagerTransformer(getActivity()), ViewCompat.LAYER_TYPE_NONE);

//示例
 public class CustPagerTransformer implements ViewPager.PageTransformer {
        private int maxTranslateOffsetX;
        private ViewPager viewPager;
        public CustPagerTransformer(Context context) {
            this.maxTranslateOffsetX = dp2px(context, 180);
        }
        @Override
        public void transformPage(View view, float position) {
            if (viewPager == null) {
                viewPager = (ViewPager) view.getParent();
            }
            int leftInScreen = view.getLeft() - viewPager.getScrollX();
            int centerXInViewPager = leftInScreen + view.getMeasuredWidth() / 2;
            int offsetX = centerXInViewPager - viewPager.getMeasuredWidth() / 2;
            float offsetRate = (float) offsetX * 0.38f / viewPager.getMeasuredWidth();
            float scaleFactor = 1 - Math.abs(offsetRate);
            if (scaleFactor > 0) {
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);
                view.setTranslationX(-maxTranslateOffsetX * offsetRate);
            }
         
        }
        /**
         * dp和像素转换
         */
        private int dp2px(Context context, float dipValue) {
            float m = context.getResources().getDisplayMetrics().density;
            return (int) (dipValue * m + 0.5f);
        }
    }

//recyclerView处理


import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewParent;

import com.github.jdsjlzx.recyclerview.LRecyclerView;
import com.hcmes.widget.IndexViewPager;

public class MRecyclerView extends LRecyclerView {
    private float x1;
    private float y1;
    public MRecyclerView(Context context) {
        super(context);
    }

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

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

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        //解决recyclerView和viewPager的滑动影响
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //当手指按下的时候
                x1 = event.getRawX();
                y1 = event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                //当手指移动的时候
                float x2 = event.getRawX();
                float y2 = event.getRawY();
                float offsetX = Math.abs(x2 - x1);
                float offsetY = Math.abs(y2 - y1);
                //当滑动recyclerView时,垂直滑动时候
                if (offsetY>offsetX) {
                    needScroll(true);//手指左移
                } else {
                    needScroll(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                x1 = y1 = 0;
                needScroll(false);
                break;
        }
        return super.dispatchTouchEvent(event);
    }
    private void needScroll(boolean interceptTouch){
        ViewParent parent =this;
        // 循环查找ViewPager, 请求ViewPager不拦截触摸事件
        while(((parent = parent.getParent()) instanceof IndexViewPager)){
            IndexViewPager indexViewPager= (IndexViewPager) parent;
            indexViewPager.setScanScroll(!interceptTouch);
        }
    }
}

IndexViewPager处理

 

/**
 * Created by Administrator on 2016/12/20.
 */
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class IndexViewPager extends ViewPager {

    private boolean isCanScroll = true;

    public IndexViewPager(Context context) {
        super(context);
    }
    public IndexViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public void setScanScroll(boolean isCanScroll) {
        this.isCanScroll = isCanScroll;
    }
    private float preX;
    @Override
    public void scrollTo(int x, int y) {
        super.scrollTo(x, y);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        if (isCanScroll) {
            return super.onTouchEvent(event);
        } else {
            return false;
        }
    }

    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        // TODO Auto-generated method stub
        super.setCurrentItem(item, smoothScroll);
    }
    @Override
    public void setCurrentItem(int item) {
        // TODO Auto-generated method stub
        super.setCurrentItem(item);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        if (isCanScroll) {
            return super.onInterceptTouchEvent(event);
        } else {
            return false;
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值