Android 带视图寻呼机的循环滚动

Android 带视图寻呼机的循环滚动,android,android-viewpager,infinite-scroll,android-scrollview,android-scrolling,Android,Android Viewpager,Infinite Scroll,Android Scrollview,Android Scrolling,我们需要使用滑动图像同步旋转轮。我已经使用了ViewPager,但是在360度旋转之后 我必须从X=0开始滚动ViewPager。是否有任何ViewPager在滚动到最后一个位置后从第一页开始 我使用setScrollX来滚动ViewPager,它还引入了 旋转动画中的小故障 如果您想实现类似于您的设计的东西,那么我建议您使用ArcLayoutManager库,我已经使用了这个库以及recycler视图来获得类似于Arc的菜单 只需为此编写自定义视图就更简单了。布局看起来很简单(只是一堆图像),

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

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

我使用setScrollX来滚动ViewPager,它还引入了 旋转动画中的小故障


如果您想实现类似于您的设计的东西,那么我建议您使用ArcLayoutManager库,我已经使用了这个库以及recycler视图来获得类似于Arc的菜单

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

忘掉
ViewPager
它很贵,视图就是一切。你需要三个视图 比如说
v1
v2
v3

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

<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>
动画已实现,工作正常


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

在viewpager中没有任何本机支持的功能支持这一点,我相信有一些库可以做到这一点,但你可能仍然会看到“小故障”,因为它们要么模仿第一个/最后一个滚动,要么在viewpager中创建大量页面,因此看起来如何实现这一点似乎是无稽之谈?我们必须使用滚轮式菜单滚动它。可能会有帮助。它基于其他库使用的相同技术。我得把它和轮子连接起来。当我用滚轮移动滚动它时,碎片无法正确加载,甚至根本无法加载。@mallaudin可以,您可以在github上发布一个简单的项目,其中包含您所拥有的设置?是的。我正在考虑这件事,因为我已经试过了一切。它与视图寻呼机一起工作,但动画不流畅。这些菜单是动态的,我们从服务器获取它们。您可以这样做,从服务器获取它并更新两个视图,重置它的x保持数组数据位置。确定。让我检查一下。您需要改进轮子动画和平滑值触发器,我正在努力使其更有用,在repo上添加我我将发送给您提交git用户
Qamar4P
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
                    }
                }
            }
        });