0

今天是个好日子。

我正在创建一个日历组件,并且正在月视图中工作。我创建了一个名为 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 的特点,这是我不能放弃的。这就是为什么我需要一种方法来添加酷滚动效果而不丢失我所拥有的。

谢谢。

4

2 回答 2

4

然后就可以使用 ViewFlinger 了!

viewflinger这是一个 android 小部件(扩展ViewGroup),它允许对一组可以水平滑动的视图进行分组。它提供了使用ViewFlipper. 这是基于Workspaceiosched项目上的类,该类是基于Launcher应用同名的类。

下载1.0.2 | 来源| JavaDoc

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

于 2011-07-06T23:18:49.917 回答
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>

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

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);
                    }
                }
            }
        }
    });
}

我希望这对您来说很清楚,并可以帮助您解决问题。它对我来说工作得很好!应该也适合你。

PS 感谢@Christian 的 ViewFlinger,太棒了。然而,它缺乏一些好的 onConfigurationChanged 逻辑,如果你有时间做一些事情:)。其余的是最好的!

于 2011-12-21T19:08:13.450 回答