可直接自定义垂直或者水平滑动的ViewPager

最近在做项目总发现了一个好用的ViewPager,经过我的一些简单改造,可以直接设置在布局的XML设置ViewPager的滑动样式。
废话不多说,直接上代码。

我们的Java代码如下:

    import android.content.Context;
    import android.content.res.TypedArray;
    import android.support.v4.view.ViewPager;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;        

    public class CustomViewPager extends ViewPager {
        public static final int SCROLL_MODE_HORIZONTAL = 0;
        public static final int SCROLL_MODE_VERTICAL = 1;
    
        private int orientationStyle;
    
        private float touchX;
        private float touchY;
        private float ratio = -1f;
    
    
        public CustomViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context, attrs);
        }
    
        private void init(Context context, AttributeSet attrs) {
            TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.CustomViewPager);
            orientationStyle = t.getInt(R.styleable.CustomViewPager_app_layout_orientation, 0);
            t.recycle();
            setScrollModeHorizontal(orientationStyle);
        }
    
        public void setScrollModeHorizontal(int mode){
            if (mode == SCROLL_MODE_VERTICAL){
                setOverScrollMode(ViewPager.OVER_SCROLL_NEVER);
                setPageTransformer(true, new VerticalPageTransformer());
            }
            orientationStyle = mode;
        }
    
        private class VerticalPageTransformer implements ViewPager.PageTransformer {
            @Override
            public void transformPage(View view, float position) {
                if (position <= 1) {
                    view.setAlpha(1);
                    view.setTranslationX(view.getWidth() * -position);
                    //set Y position to swipe in from top
                    float yPosition = position * view.getHeight();
                    view.setTranslationY(yPosition);
    
                } else {
                    view.setAlpha(0);
                }
            }
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            return super.onInterceptTouchEvent(customTouchEvent(MotionEvent.obtain(event)));
        }
    
        private MotionEvent customTouchEvent(MotionEvent ev) {
            if (orientationStyle == SCROLL_MODE_VERTICAL){
                if (ratio == -1) {
                    ratio = (float) getWidth() / getHeight();
                }
                touchX = ev.getX();
                touchY = ev.getY();
                ev.setLocation(touchY * ratio, touchX / ratio);
            }
            return ev;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            return super.onTouchEvent(customTouchEvent(ev));
        }
    }

在你的attrs.xml文件中添加如下定义:

<declare-styleable name="CustomViewPager">
    <attr name="app_layout_orientation" format="enum">
        <enum name="horizontal" value="0"></enum>
        <enum name="vertical" value="1"></enum>
    </attr>
</declare-styleable>

最后你就可以愉快的在你的布局中设置了

示例代码如下

     <?xml version="1.0" encoding="utf-8"?>
      <FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
    
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.aquila.custom.widget.view.CustomViewPager
            android:id="@+id/second_vertical_ViewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
   
            app:app_layout_orientation="vertical"
            />
    </FrameLayout>

以上就是这样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,842评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,262评论 4 61
  • 亦舒在《准备一件晚装》里写道:“照说人到中年,何必苦苦节食,关起门来,肥瘦并无人晓得;既无亲友来访,何故将家里收拾...
    一缕清风袭来阅读 810评论 4 3
  • 今天是感恩节,感谢今生相伴的每个人, 人和人相遇,靠的是一点缘份 人和人相处,靠的是一点诚意 知音是贴切的默契 知...
    热点前线动态Ok阅读 243评论 0 2
  • 丐帮是一个非常喜欢开会的组织,除了内部会议,它还热衷召集友邻单位一起开会,然而每次的联合会议几乎都用一个名字:英雄...
    ichenallen阅读 1,588评论 1 9