原创首发
ViewPager只能横着滚动?no,也可以竖着滚动,ViewPager.PageTransformer有奇效,简单实例,复制粘贴就有效果。

这里要实现的就是ViewPager的垂直滚动。先上效果图了。
https://chuantu.xyz/t6/703/1575879903x2728278915.gif
前方高能,注意代码。
第一,MainActivity
public class MainActivity extends Activity {
private VerticalViewPager mViewPager;
//下面三张图片自己截取一下添加到mipmap中就ok。
private int[] mImgIds = new int[]{R.mipmap.nvhaione, R.mipmap.nvhaitwo, R.mipmap.nvhaithree};
private List<ImageView> mImageViews = new ArrayList<ImageView>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initData();
//下面这个 VerticalViewPager 不要写错哦。
mViewPager = (VerticalViewPager) findViewById(R.id.id_viewpager);
mViewPager.setAdapter(new PagerAdapter() {
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mImageViews.get(position));
return mImageViews.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
container.removeView(mImageViews.get(position));
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public int getCount() {
return mImgIds.length;
}
});
}
//数据初始化
private void initData() {
for (int imgId : mImgIds) {
ImageView imageView = new ImageView(getApplicationContext());
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setImageResource(imgId);
mImageViews.add(imageView);
}
}
}
第二,VerticalViewPager
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
this(context, null);
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
//设置viewpage的切换动画,这里设置才能真正实现垂直滑动的viewpager
setPageTransformer(true, new VerticalPageTransformer());
}
/**
*---------------- 调整xy方向 --------------------------------
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercept = super.onInterceptTouchEvent(swapEvent(ev));
swapEvent(ev);
return intercept;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapEvent(ev));
}
private MotionEvent swapEvent(MotionEvent event) {
//获取宽高
float width = getWidth();
float height = getHeight();
//将Y轴的移动距离转变成X轴的移动距离
float swappedX = (event.getY() / height) * width;
//将X轴的移动距离转变成Y轴的移动距离
float swappedY = (event.getX() / width) * height;
//重设event的位置
event.setLocation(swappedX, swappedY);
return event;
}
/**
* ---------------------- 实现PageTransformer重写。 -----------------------------
*/
public class VerticalPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
view.setAlpha(1);
// Counteract the default slide transition
view.setTranslationX(view.getWidth() * -position);
//set Y position to swipe in from top
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
}
第三:activity_main.xml
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.xxxxxx.yyyyyyactivity.VerticalViewPager
android:id="@+id/id_viewpager"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:background="#6666"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
第四:容易出错的地方
activity_main.xml中的 <com.xxxxxx.yyyyyyactivity.VerticalViewPager> 这个是你自己的 包名+上面自己新建的VerticalViewPager。
OK,看到这里了,那么重点来了,点个