如题,本来我是上面tablayout+viewpager然后view pager这个Afragment里面还是有个view pager图片,可以左右划的,之前没注意,因为滑动到最后一张图片的时候,继续滑动就会使tablayout切换到第二个Bfragment上面去,产品说不行,要滑倒最后一张图片的时候不能滑动,不能切换到另一个页面。。类似与这样的,没办法,那就去快乐星球去研究吧。。研究一上午,还算成功了吧,下面直接贴代码,只需要在xml里面替换左右滑动的viewpager就行了,如果不对,不负责任的哦。。
public class TabLyoutScrollViewPager extends ViewPager {
public TabLyoutScrollViewPager(Context context) {
super(context);
}
public TabLyoutScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
float aFloatX, aFloatY;
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { super.onInterceptTouchEvent(ev); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: aFloatX = ev.getX(); aFloatY = ev.getY(); //告诉父view不要拦截事件,如果不在点击的时候加这句话,父view会处理滑动事件 getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: float xDifference = Math.abs(ev.getX() - aFloatX); float yDifference = Math.abs(ev.getY() - aFloatY); //点击造成的滑动误差 if (xDifference < 10 && yDifference < 10) { return false; } Boolean intercepted = intercepted(ev.getX(), ev.getY()); if (!intercepted) { //告诉父view不要拦截事件,并且自己消费事件,不然左右滑动的时候点击事件抢占焦点导致滑动不流畅 getParent().requestDisallowInterceptTouchEvent(true); return true; } else { //请求父view拦截事件,可以上下滑动 getParent().requestDisallowInterceptTouchEvent(false); } break; default: } //告诉父view不要拦截事件 // getParent().requestDisallowInterceptTouchEvent(true); return false; }
/**
* 判断是否拦截
*
* @return Boolean
*/
private Boolean intercepted(Float x, Float y) {
float xDifference = Math.abs(x - aFloatX);
float yDifference = Math.abs(y - aFloatY);
//根据距离差判断
if (yDifference > xDifference) {
//如果Y轴距离差大于X轴则拦截
return true;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
//viewpager才能滑动
super.onTouchEvent(ev);
//设置未true,子view没有消耗点击事件,则会把事件传递个父view的onTouchEvent。所以这边设置为true,表示由这个viewpager消耗,不传递到上一级父view
return true;
}
}