如何使ViewFlipper像Scroller一样?

时间:2011-07-06 23:14:56

标签: android viewflipper scroller

大家好日子。

我正在创建一个日历组件,我正在月视图中工作。我创建了一个名为MonthView的视图,我正在向ViewFlipper添加一些这样的实例:

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

我已经实现了手势,以便在向左或向右滑动手指时更改视图。这将循环更新并显示月份。

现在,我需要在触摸并慢慢滑动手指时给出轻松的动作。当我们使用Slider而不是ViewFlipper时,我们得到了相同的结果。

Scroller的问题是效果不是循环的。一旦我到达最后一个视图,我就必须向另一个方向滑动。

我需要有人帮我找到如何为ViewFlipper提供类似滚动的效果,或者如何让Scroller循环播放。

提前致谢。

额外评论

我已经实现了一个包含2个视图的ViewFlipper。我使用SimpleOnGestureListener.onFling(...)方法更新视图,我得到的行为是这样的:

想象一下,我总是从一个页面向左滑动,就像翻阅一本书的页面来阅读下一页一样,并且还想象在翻转后显示的视图标题中有一个标题。

查看#0 - >图片说明:2011年1月

查看#1 - >图说:2011年2月

查看#0 - >图片说明:2011年3月

查看#1 - >图片说明:2011年4月

查看#0 - >图片说明:2011年5月

如果此时我从左向右滑动,结果将是:

查看#1 - >图片说明:2011年4月

查看#0 - >图片说明:2011年3月

循环向前或向后移动的能力,让用户有无限视图的想法,但只使用一对是ViewFlipper的特征,这是我无法放松的。 这就是为什么我需要一种方法来添加酷炫的滚动效果而不会失去我所拥有的东西。

感谢。

2 个答案:

答案 0 :(得分:4)

然后你可以使用ViewFlinger!

  
    

viewflinger 这是一个Android小部件(扩展ViewGroup),允许对可以水平滑动的一组视图进行分组。它提供了使用ViewFlipper无法实现的更平滑过渡。这基于iosched项目上的Workspace类,该类基于与Launcher应用程序名称相同的类。

         

下载1.0.2 | Sources | JavaDoc

  

如果您使用Maven,则可以将其用作此存储库中的工件:http://mvn.egoclean.com/。另外,你想看看这个视频我在哪里展示它的样子:http://www.youtube.com/watch?v=gqIXq5x7iLs(对不起我的口音很糟糕)

答案 1 :(得分:2)

我认为你想要做的是创建一个显然无限的布局列表,由ViewFlipper或Christian的ViewFlinger引爆。而且你还想继续在Flinger / Flipper中重复使用视图/布局。对吗?

如果是,可能以下是您想要做的。我是基于Christian的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>

然后在您的活动中,您将获取三个视图的数组,以便您可以直接通过数组访问它们,而不是每次都在flinger中搜索,

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逻辑,如果你有时间把东西放在:)。其余的是最好的!