使用 View Pager 进行循环滚动

Circular scrolling with View Pager

我们有一个要求用滑动图像同步旋转轮。我为此使用了 ViewPager 但在 360 度旋转后

我必须从 X = 0 开始滚动 ViewPager。有没有ViewPager滚动到最后一个位置后从第一页开始的?

I use setScrollX for scrolling ViewPager which also introduce glitches in rotating animation.

如果你想实现类似你的设计的东西,那么我建议你使用 Arc LayoutManager Library,我已经使用这个库和 recycler View 来获得 Arc Like 菜单。

写个自定义View会更简单。布局看起来很简单(只是一堆图像),而 ViewPager 对于像这样的简单事情有很大的开销。使用自定义视图,您还可以通过触摸监听器处理自己的滚动。

忘了 ViewPager 它很贵,观点就是一切。你需要三个膨胀视图 假设 v1v2v3

我使用您提供的 git 示例项目,将您的 HorizontalPaging 替换为 xml

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:id="@+id/scroller"
        app:layout_constraintEnd_toEndOf="parent"
        android:fillViewport="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <ImageView
            android:id="@+id/v1"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:contentDescription="@null"
            android:src="@drawable/slider_topup" />

        <ImageView
            android:id="@+id/v2"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:contentDescription="@null"
            android:src="@drawable/slider_balance" />

        <ImageView
            android:id="@+id/v3"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:contentDescription="@null"
            android:src="@drawable/slider_bundles" />

    </RelativeLayout>

并将代码添加到您的 onCreate

final View v1 = findViewById(R.id.v1);
        final View v2 = findViewById(R.id.v2);
        final View v3 = findViewById(R.id.v3);

        //set initial state keep it sync with wheel at start
        v1.setX(0);
        v2.setX(screenSize);
        v3.setX(2*screenSize);

        circle.setOnAngleChangeListener(new NowCircle.OnAngleChangeListener() {
            @Override
            public void onAngleChange(float delta) {
                float v1x = v1.getX() + (oneDegree * delta);
                float v2x = v2.getX() + (oneDegree * delta);
                float v3x = v3.getX() + (oneDegree * delta);

                Log.d("dd","delta:"+delta+", v1x:"+v1x+", v2x:"+v2x +", v3x:"+v3x);

                v1.setX(v1x);
                v2.setX(v2x);
                v3.setX(v3x);

                if(delta > 0){

                    if (v1x >= 0 && v1x <= screenSize) {
                        v3.setX(-screenSize+v1x);
                        //update data here
                    }else if (v3x >= 0  && v3x <= screenSize){
                        v2.setX(-screenSize+v3x);
                        //update data here
                    }else {
                        v1.setX(-screenSize+v2x);
                        //update data here
                    }
                }else {
                    if (v3x <= 0 && v3x >= -screenSize) {
                        v1.setX(screenSize+v3x);
                        //update data here
                    }else if(v1x <= 0 && v1x >= -screenSize){
                        v2.setX(screenSize+v1x);
                        //update data here
                    }else {
                        v3.setX(screenSize+v2x);
                        //update data here
                    }
                }
            }
        });

动画实现,工作正常。

您需要对此进行改进,将数据与您的自定义视图绑定并创建一个单独的管理器 class。我把时间花在了这上面。你知道:)