27

改善が必要な ViewFlipper 実装があります。この ViewFlipper には 3 つの子ビューがあります。基本的に、現在アクティブな子ビューのインジケーターが必要です。私のViewFlipperは、リストビューなどを持つ複雑なレイアウトの一部にすぎません.

ビューの切り替えも自動で、指定された間隔で行われます。

Android の SDK リファレンスから、ViewFlipper が子ビューを変更するときのリスナーは見たことがありません。

そのイベントのリスナーを持つ方法を知っていますか?

または、 ViewFlipper を使用する以外に、この機能を実装できる別の方法はありますか?

ありがとう!

4

5 に答える 5

42

ビューの切り替え時にアニメーション (アウトまたはイン アニメーション) を適用する場合、リスナーをアニメーションに設定して、たとえば、アニメーションの終了時に動作させることができます。

   viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
      public void onAnimationStart(Animation animation) {}
      public void onAnimationRepeat(Animation animation) {}
      public void onAnimationEnd(Animation animation) {}
   });
于 2010-09-28T13:28:49.400 に答える
4

どの子がアクティブになっているかを検出する 1 つの方法を見つけ

ました。ViewFlipper に onLayoutChangeListener を追加し、ViewFlipper の getCurrentView を取得してから、ViewFlipper の子と比較します。

アクティビティが onDestory のときに OnLayoutChangeListener を削除することを忘れないでください

private View page1, page2, page3, page4;
private ViewFlipper viewFlipper;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.flipper);

    page1 = findViewById(R.id.MyFlipper_page01);
    page2 = findViewById(R.id.MyFlipper_page02);
    page3 = findViewById(R.id.MyFlipper_page03);
    page4 = findViewById(R.id.MyFlipper_page04);

    viewFlipper = (ViewFlipper) findViewById(R.id.MyFlipper_flipper);

    viewFlipper.addOnLayoutChangeListener(onLayoutChangeListener_viewFlipper);

}

View.OnLayoutChangeListener onLayoutChangeListener_viewFlipper = new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

       if(viewFlipper.getCurrentView() == page1)
           Log.d("test", "change to flipper_page1");
       else if(viewFlipper.getCurrentView() == page2)
           Log.d("test", "change to flipper_page2");
       else if(viewFlipper.getCurrentView() == page3)
           Log.d("test", "change to flipper_page3");
       else if(viewFlipper.getCurrentView() == page4)
           Log.d("test", "change to flipper_page4");



    }
};


@Override
protected void onDestroy() {
    super.onDestroy();

    viewFlipper.removeOnLayoutChangeListener(onLayoutChangeListener_viewFlipper);

}
于 2015-11-05T09:06:21.190 に答える
-1

これは古い質問ですが、うまくいくまともなアプローチを見つけました。

public class MainLaunch extends Activity {

    ... main setup and code

    int currentIndex = 0;
    int maxIndex = 3;

    // set specific animations for the view flipper on showNext
    // only showNext while in valid index
    public void showNext() {
        if( currentIndex < maxIndex )
        {
            currentIndex++;
            viewFlipper.setInAnimation(getBaseContext(), R.anim.slide_in_left);
            viewFlipper.setOutAnimation(getBaseContext(), R.anim.slide_out_right);
            viewFlipper.showNext();
        }
    }

    // set specific animations for the view flipper on showPrevious
    // only showPrevious while in valid index
    public void showPrevious() {
        if( currentIndex > 0 )
        {
            currentIndex--;
            viewFlipper.setInAnimation(getBaseContext(), R.anim.slide_in_right);
            viewFlipper.setOutAnimation(getBaseContext(), R.anim.slide_out_left);
            viewFlipper.showPrevious();
        }
    }

    // get current flipped view
    public View getCurrentView() {
        return viewFlipper.getChildAt(currentIndex);
    }


}

次に、ViewFlipper を使用するには、任意の場所で showNext() または showPrevious を呼び出し、getCurrentView() を呼び出して現在アクティブなビューを取得できます。これは、左右の反転に異なるアニメーションを設定し、現在の作業ビューを簡単に取得するのに役立ちます。

于 2014-08-11T11:08:17.697 に答える