安卓 ViewPager-上下滑动
自带是左右滑动的,写一个类,继承自 ViewPager,使其实现上下滑动,网上有人写好了,我也偷懒了,直接复制过来。原文见:https://blog.csdn.net/k_bb_666/article/details/79843477。该文章还介绍了横向、纵向嵌套的问题。package com.itpow.android;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// 最重要的设置,将viewpager翻转
setPageTransformer(true, new VerticalPageTransformer());
// 设置去掉滑到最左或最右时的滑动效果
setOverScrollMode(OVER_SCROLL_NEVER);
}
private class VerticalPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
if (position < -1) { // [-Infinity,-1)
// 当前页的上一页
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
view.setAlpha(1);
// 抵消默认幻灯片过渡
view.setTranslationX(view.getWidth() * -position);
//设置从上滑动到Y位置
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
} else { // (1,+Infinity]
// 当前页的下一页
view.setAlpha(0);
}
}
}
/**
* 交换触摸事件的X和Y坐标
*/
private MotionEvent swapXY(MotionEvent ev) {
float width = getWidth();
float height = getHeight();
float newX = (ev.getY() / height) * width;
float newY = (ev.getX() / width) * height;
ev.setLocation(newX, newY);
return ev;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
swapXY(ev);
return intercepted; //为所有子视图返回触摸的原始坐标
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapXY(ev));
}
}
使用的时候,就是布局文件中不用 ViewPager,而用这个 VerticalViewPager。
安卓 ViewPager-上下滑动