Как заставить ViewFlipper вести себя как скроллер? - PullRequest
0 голосов
/ 07 июля 2011

Всем доброго времени суток.

Я создаю компонент календаря и работаю в режиме просмотра месяца.Я создал представление с именем MonthView, и я добавляю пару экземпляров этого к ViewFlipper:

viewFlipper = new ViewFlipper(getContext());
viewFlipper.addView(new MonthView(viewFlipper.getContext()));
viewFlipper.addView(new MonthView(viewFlipper.getContext()));

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

Теперь мне нужно плавно дать эффект броска при касании и медленном скольжении пальца.То же самое мы получаем, когда мы используем Slider вместо ViewFlipper.

Проблема со Scroller заключается в том, что эффект не циклический.Как только я доберусь до последнего вида, мне нужно будет скользить в другом направлении.

Мне нужен кто-то, кто поможет мне найти, как придать эффект прокрутки ViewFlipper или сделать циклический скроллер.

Заранее спасибо.

Дополнительный комментарий:

Я уже реализовал ViewFlipper с 2 представлениями.Я обновляю представления с помощью метода SimpleOnGestureListener.onFling (...), и поведение, которое я получаю, выглядит примерно так:

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

Просмотр # 0 -> Заголовок: январь 2011

Просмотр # 1 ->Заголовок: февраль 2011

Вид # 0 -> Заголовок: март 2011

Вид №1 -> Заголовок: апрель 2011

Вид №0 -> Заголовок:Май 2011

Если в этот момент я проведу слайд слева направо, результат будет примерно таким:

Вид # 1 -> Заголовок: апрель 2011

Вид #0 -> Заголовок: март 2011

Возможность циклического перемещения вперед или назад, что дает пользователю идею иметь бесконечные представления, но использование только пары характерно для ViewFlipper, и это то, что я не могурыхлый.Вот почему мне нужен способ добавить эффект крутой прокрутки без потери того, что у меня есть.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Тогда вы можете использовать ViewFlinger!

viewflinger это виджет для Android (расширяет ViewGroup), который позволяет сгруппировать набор видов, которые можно перемещать по горизонтали. Он предлагает более плавный переход, который нельзя выполнить с помощью ViewFlipper. Это основано на классе Workspace в проекте iosched, который основан на классе с тем же именем приложения Launcher.

Скачать : 1.0.2 | Источники | JavaDoc

Если вы используете Maven, вы можете использовать его как артефакт из этого репозитория: http://mvn.egoclean.com/. Кроме того, вы хотели бы посмотреть это видео, где я покажу, как оно выглядит: http://www.youtube.com/watch?v=gqIXq5x7iLs (извините за мой акцент который отстой)

2 голосов
/ 21 декабря 2011

Я думаю, что вы хотели сделать, это создать очевидно бесконечный список раскладок, которые можно использовать либо с помощью ViewFlipper, либо с помощью ViewFlinger Кристиана. А также вы хотите продолжать использовать виды / макеты внутри Flinger / Flipper. Правильно?

Если да, вероятно, вы хотели бы сделать следующее. Я сделал это на основе Кристиана ViewFlinger,

Вот, пожалуйста,

Сначала добавьте три макета в ViewFlinger:

<com.egoclean.android.widget.flinger.ViewFlinger
    android:id="@+id/calendarViewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ScrollView
        android:id="@+id/calendarViewLayout0"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ScrollView>

    <ScrollView
        android:id="@+id/calendarViewLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ScrollView>

    <ScrollView
        android:id="@+id/calendarViewLayout2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ScrollView>
</com.egoclean.android.widget.flinger.ViewFlinger>

Затем внутри вашей деятельности вы берете массив из трех представлений, чтобы вы могли обращаться к ним напрямую через массив, вместо того, чтобы каждый раз искать внутри фингера,

private ViewFlinger viewFlinger;
private ViewGroup layouts[] = new ViewGroup[3];
private boolean userEvent = false;

@Override
public final void onCreateSub(Bundle savedInstanceState)
{
    setContentView(R.layout.your_layout);

    viewFlinger = (ViewFlinger) findViewById(R.id.calendarViewFlipper);
    layouts[0] = (ViewGroup) findViewById(R.id.calendarViewLayout0);
    layouts[1] = (ViewGroup) findViewById(R.id.calendarViewLayout1);
    layouts[2] = (ViewGroup) findViewById(R.id.calendarViewLayout2);

    viewFlinger.setOnScreenChangeListener(new ViewFlinger.OnScreenChangeListener()
    {
        @Override
        public void onScreenChanging(View newScreen, int newScreenIndex)
        {

        }

        @Override
        public void onScreenChanged(View newScreen, int newScreenIndex)
        {
            if (userEvent)
            {
                ViewGroup tempLayout = null;

                if (newScreenIndex != 1)
                {
                    // We don't want our actions to raise events and create a cyclic event chain
                    userEvent = false;

                    if (newScreenIndex == 2) // Scrolling towards right
                    {
                        tempLayout = layouts[0];

                        viewFlinger.removeViewFromFront();
                        viewFlinger.addViewToBack(tempLayout);
                        layouts[0] = layouts[1];
                        layouts[1] = layouts[2];
                        layouts[2] = tempLayout;

                        // Any other logic comes here...
                    }
                    else if (newScreenIndex == 0) // Scrolling towards left
                    {
                        tempLayout = layouts[2];

                        viewFlinger.removeViewFromBack();
                        viewFlinger.addViewToFront(tempLayout);
                        layouts[2] = layouts[1];
                        layouts[1] = layouts[0];
                        layouts[0] = tempLayout;

                        // Any other logic comes here...
                    }

                    // We switch the screen index back to 1 since the current screen index would change back to 1
                    viewFlinger.setCurrentScreenNow(1, false);

                    userEvent = true;

                    // And any other logic that you'd like to put when the swapping is complete May be fill the swapped view with the correct values based on its new location etc...
                    View result = refreshView(tempLayout.getChildAt(0));

                    if (result.getParent() != tempLayout)
                    {
                        ((ViewGroup) result.getParent()).removeView(result);

                        tempLayout.removeAllViews();
                        tempLayout.addView(result);
                    }
                }
            }
        }
    });
}

Надеюсь, вам это ясно и поможет решить вашу проблему. Это работает очень хорошо для меня! Должно работать хорошо и для вас.

P.S. Спасибо @ Christian за ViewFlinger, это потрясающе. Однако в нем отсутствует хорошая логика onConfigurationChanged, если у вас есть время, вставьте что-нибудь :). Остальное самое лучшее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...