First, let's see how the viewpager is implemented. The custom inherits the viewpager.
I've seen that csdn thinks that it's a good writer. There are many ways to implement it. You can see these blogs
Android ViewPager slide vertically slide vertically viewpager
You can continue to look at this primitive stackoverflow There are many ways to realize this. Here are two examples. They are all copied
import android.support.v4.view.ViewPager; public class VerticalViewPager extends ViewPager { public VerticalViewPager(Context context) { this(context, null); } public VerticalViewPager(Context context, AttributeSet attrs) { super(context, attrs); init(); } @Override public boolean canScrollHorizontally(int direction) { return false; } @Override public boolean canScrollVertically(int direction) { return super.canScrollHorizontally(direction); } private void init() { setPageTransformer(true, new VerticalPageTransformer()); setOverScrollMode(View.OVER_SCROLL_NEVER); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final boolean toIntercept = super.onInterceptTouchEvent(flipXY(ev)); flipXY(ev); return toIntercept; } @Override public boolean onTouchEvent(MotionEvent ev) { final boolean toHandle = super.onTouchEvent(flipXY(ev)); flipXY(ev); return toHandle; } private MotionEvent flipXY(MotionEvent ev) { final float width = getWidth(); final float height = getHeight(); final float x = (ev.getY() / height) * width; final float y = (ev.getX() / width) * height; ev.setLocation(x, y); return ev; } private static final class VerticalPageTransformer implements ViewPager.PageTransformer { @Override public void transformPage(View view, float position) { final int pageWidth = view.getWidth(); final int pageHeight = view.getHeight(); if (position < -1) { view.setAlpha(0); } else if (position <= 1) { view.setAlpha(1); view.setTranslationX(pageWidth * -position); float yPosition = position * pageHeight; view.setTranslationY(yPosition); } else { view.setAlpha(0); } } } }
If you want to see an example, click on the second URL above
Take a look at the second method,,
To introduce:
You can use a ViewPager.PageTransformer to give the illusion of a vertical ViewPager. To achieve scrolling with a vertical instead of a horizontal drag you will have to override ViewPager's default touch events and swap the coordinates of MotionEvents prior to handling them,
You can use ViewPager. PageTransformer provides the illusion of vertical view page navigation. To scroll vertically instead of dragging horizontally, you must override the default touch events for ViewPager and swap the MotionEvents coordinates before processing them,
import android.content.Context import android.support.v4.view.ViewPager import android.util.AttributeSet import android.view.MotionEvent import android.view.View /** * Created by Administrator on 2018/8/9/009. */ class VerticalViewPager : ViewPager { constructor(context: Context?) : super(context){ init() } constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs){ init() } private fun init() { // The majority of the magic happens here setPageTransformer(true, VerticalPageTransformer()) // The easiest way to get rid of the overscroll drawing that happens on the left and right overScrollMode = View.OVER_SCROLL_NEVER } private inner class VerticalPageTransformer : ViewPager.PageTransformer { override fun transformPage(view: View, position: Float) { if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.alpha = 0f } else if (position <= 1) { // [-1,1] view.alpha = 1f // Counteract the default slide transition view.translationX = view.width * -position //set Y position to swipe in from top val yPosition = position * view.height view.translationY = yPosition } else { // (1,+Infinity] // This page is way off-screen to the right. view.alpha = 0f } } } /** * Swaps the X and Y coordinates of your touch event. */ private fun swapXY(ev: MotionEvent): MotionEvent { val width = width.toFloat() val height = height.toFloat() val newX = ev.y / height * width val newY = ev.x / width * height ev.setLocation(newX, newY) return ev } override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { val intercepted = super.onInterceptTouchEvent(swapXY(ev)) swapXY(ev) // return touch coordinates to original reference frame for any child views return intercepted } override fun onTouchEvent(ev: MotionEvent): Boolean { return super.onTouchEvent(swapXY(ev)) } }
If you need horizontal inside point