当前位置: 移动技术网 > 移动技术>移动开发>Android > Android Viewpager+Fragment 实现画廊式效果

Android Viewpager+Fragment 实现画廊式效果

2020年07月23日  | 移动技术网移动技术  | 我要评论

先看一下效果图

3 1  2  3 1

向左滑动到最后一个 显示出第一个

向右滑动到第一个 显示出最后一个

1.创建一个自定义类 ZoomOutPageTransformer (实现放大缩小)

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
    //自由控制缩放比例
    private static final float MAX_SCALE = 1f;
    private static final float MIN_SCALE = 0.8f;//0.85f

    @Override
    public void transformPage(View page, float position) {

        if (position <= 1) {

            float scaleFactor = MIN_SCALE + (1 - Math.abs(position)) * (MAX_SCALE - MIN_SCALE);

            page.setScaleX(scaleFactor);

            if (position > 0) {
                page.setTranslationX(-scaleFactor * 2);
            } else if (position < 0) {
                page.setTranslationX(scaleFactor * 2);
            }
            page.setScaleY(scaleFactor);
        } else {

            page.setScaleX(MIN_SCALE);
            page.setScaleY(MIN_SCALE);
        }
    }
}

2.activity_main布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp"
        android:text="viewpager实现画廊效果"
        android:textColor="@color/colorPrimary"/>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="200dp"
        android:layout_height="300dp"
        android:layout_gravity="center"
        android:layout_marginBottom="30dp"
        android:clipChildren="false"
        android:layout_marginTop="30dp"/>
</LinearLayout>

3.Activity_main

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private LinearLayout ll_layout;
    private List<Fragment> list;

    private boolean mIsChanged = false;
    private int mCurrentPagePosition = FIRST_ITEM_INDEX;
    private static final int POINT_LENGTH = 3;
    private static final int FIRST_ITEM_INDEX = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        mViewPager = (ViewPager) findViewById(R.id.viewPager);
        ll_layout = (LinearLayout) findViewById(R.id.ll_layout);

        //添加到数组
        list =new ArrayList<>();
        list.add(new Fragment_three());
        list.add(new Fragment_one());
        list.add(new Fragment_two());
        list.add(new Fragment_three());
        list.add(new Fragment_one());

        //设置适配器
        mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {

            @Override
            public Fragment getItem(int position) {
                return list.get(position);
            }

            @Override
            public int getCount() {
                return list.size();
            }
        });
        mViewPager.setCurrentItem(1);
        mViewPager.setPageMargin(20);
        mViewPager.setOffscreenPageLimit(list.size());
        mViewPager.setPageTransformer(true, new ZoomOutPageTransformer());//设置画廊模式
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                mIsChanged = true;
                if (position > POINT_LENGTH) {
                    // 末位之后,跳转到首位(1)
                    mCurrentPagePosition = FIRST_ITEM_INDEX;
                } else if (position < FIRST_ITEM_INDEX) {
                    // 首位之前,跳转到末尾(N)
                    mCurrentPagePosition = POINT_LENGTH;
                } else {
                    mCurrentPagePosition = position;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if (ViewPager.SCROLL_STATE_IDLE == state) {
                    if (mIsChanged) {
                        mIsChanged = false;
                        mViewPager.setCurrentItem(mCurrentPagePosition, false);
                    }
                }

            }
        });

//        //viewPager左右两边滑动无效的处理
//        ll_layout.setOnTouchListener(new View.OnTouchListener() {
//            @Override
//            public boolean onTouch(View view, MotionEvent motionEvent) {
//                return mViewPager.dispatchTouchEvent(motionEvent);
//            }
//        });
    }
}

 

本文地址:https://blog.csdn.net/weixin_42630638/article/details/107477698

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网