10

我们需要使用滑动图像来同步旋转轮。我已经使用了 ViewPager,但是在 360 度旋转之后

我必须从X = 0开始滚动ViewPager。是否有任何ViewPager在滚动到最后一个位置后从第一页开始?

我使用setScrollX来滚动ViewPager,这也会在旋转动画中引入故障。

4

3 回答 3

3

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

于 2018-04-26T07:45:17.320 回答
1

如果你想实现你的设计,那么我建议你使用 ArcLayoutManager 库,我已经使用这个库和回收器视图来获得 Arc Like 菜单。

于 2018-04-26T07:41:04.400 回答
1

忘记ViewPager它的昂贵,意见就是一切。你需要三个膨胀的视图让我们说v1,,v2v3

我使用您提供的 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
                    }
                }
            }
        });

动画实现,工作正常。

在此处输入图像描述

您需要改进这一点并将数据与您的自定义视图绑定并创建一个单独的管理类。我把时间花在了这件事上。你知道 :)

于 2018-04-26T10:20:48.513 回答