android viewpager slides vertically and horizontally vertical viewpager plays automatically according to timer

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


public class VerticalViewPager extends ViewPager {

    public VerticalViewPager(Context context) {
        this(context, null);

    public VerticalViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);

    public boolean canScrollHorizontally(int direction) {
        return false;

    public boolean canScrollVertically(int direction) {
        return super.canScrollHorizontally(direction);

    private void init() {
        setPageTransformer(true, new VerticalPageTransformer());

    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final boolean toIntercept = super.onInterceptTouchEvent(flipXY(ev));
        return toIntercept;

    public boolean onTouchEvent(MotionEvent ev) {
        final boolean toHandle = super.onTouchEvent(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 {
        public void transformPage(View view, float position) {
            final int pageWidth = view.getWidth();
            final int pageHeight = view.getHeight();
            if (position < -1) {
            } else if (position <= 1) {
                view.setTranslationX(pageWidth * -position);
                float yPosition = position * pageHeight;
            } else {

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.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){
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs){

    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

Keywords: Android

Added by helbom on Sun, 05 Jan 2020 02:47:26 +0200