0

みなさん、良い一日を。

カレンダー コンポーネントを作成しており、月ビューで作業しています。MonthView という名前のビューを作成しました。これのいくつかのインスタンスを ViewFlipper に追加しています。

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

フリング ジェスチャを実装して、指を左右にスライドさせるとビューが変わるようにしました。これにより、月が周期的に更新されて表示されます。

ここで、指に触れてゆっくりとスライドさせるときに、フリング ジェスチャにスムーズな効果を与える必要があります。ViewFlipper の代わりに Slider を使用した場合も同じです。

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 を使用できます。

viewflingerViewGroupこれは、水平方向にスワイプできる一連のビューをグループ化できるAndroid ウィジェット (extends ) です。では実現できない、よりスムーズなトランジションを提供しますViewFlipper。これはWorkspace、ランチャー アプリと同じ名前のクラスに基づく iosched プロジェクトのクラスに基づいています。

ダウンロード: 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 に 3 つのレイアウトを追加します。

<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>

次に、アクティビティ内で 3 つのビューの配列を取得して、フリンガー内で毎回検索するのではなく、配列を介して直接アクセスできるようにします。

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 ViewFlinger のおかげで @ クリスチャン、それは素晴らしいです。ただし、適切な onConfigurationChanged ロジックが不足しています。時間があれば、何かを入れてください:)。残りは最高です!

于 2011-12-21T19:08:13.450 に答える