Круговая прокрутка с пейджером просмотра


У нас есть требование для синхронизации вращающегося колеса со скользящими изображениями. Я использовал ViewPager для него, но после поворота на 360 градусов

Я должен начать прокрутку ViewPager из X = 0. Существует ли какой-либоViewPager , который начинается с первой страницы после прокрутки до последней позиции?

Я использую setScrollX для прокрутки ViewPager , который также вводит глюки в вращающейся анимации . Я хочу достичь что-то вроде ниже изображение.

Вот ссылка на пример приложения, просто минимальная реализация того, что я хочу достичь.

Введите описание изображения здесь

3 9

3 ответа:

Забудьте о ViewPager это дорого, просмотры-это все. Вам нужно три завышенных мнения скажем так v1,v2,v3

Я работаю с вашим ГИТ образец проекта, заменить 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
                    }
                }
            }
        });

Анимация достигнута, работает нормально.

Введите описание изображения здесь

Вам нужно улучшить это и связать данные с вашими пользовательскими представлениями и создать один отдельный класс управления. Я вложил в это все свое время. вы знаете :)

Было бы проще просто написать пользовательский вид для этого. Макет кажется простым (просто куча изображений), и ViewPager имеет большие накладные расходы для простых вещей, таких как это. С пользовательским представлением вы также можете иметь дело с прокруткой самостоятельно через сенсорные прослушиватели.

Если вы хотите получить что-то вроде вашего дизайна, то я предлагаю вам использовать библиотеку ArcLayoutManager, я использовал эту библиотеку вместе с recycler View, чтобы получить меню Arc Like.