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;
}
}
}