1. ホーム
  2. android

[解決済み] AndroidのImageViewを使ったフェードイン・フェードアウト

2023-03-15 03:50:18

質問

作成中のスライドショーでトラブルが発生しました。

xmlでフェードインとフェードアウトの2つのアニメーションを作りました。

フェードイン.xml

    <?xml version="1.0" encoding="UTF-8"?>
       <set xmlns:android="http://schemas.android.com/apk/res/android">
         <alpha android:fromAlpha="0.0" android:toAlpha="1.0" 
          android:interpolator="@android:anim/accelerate_interpolator" 
          android:duration="2000"/>
     </set>

フェードアウト.xml

    <?xml version="1.0" encoding="UTF-8"?>
       <set xmlns:android="http://schemas.android.com/apk/res/android">
         <alpha android:fromAlpha="1.0" android:toAlpha="0.0" 
          android:interpolator="@android:anim/accelerate_interpolator" 
          android:duration="2000"/>
     </set>

現在表示されている画像がフェードアウトし、別の画像がフェードインするように、フェード効果を使用してImageViewから画像を変更しようとしているものです。 すでに画像が設定されていることを考えると、これで問題なくこの画像をフェードアウトさせることができます。

    Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.your_fade_in_anim);
    imageView.startAnimation(fadeoutAnim);

でもって、次に表示される画像を設定。

    imageView.setImageBitmap(secondImage);

imageViewに表示されるだけで、アニメーションを設定すると、画像が隠され、フェードインしてしまいます...。これを解決する方法はないでしょうか? imageView.setImageBitmap(secondImage)を実行したときです。 コマンドを実行すると、画像はすぐに表示されず、フェードインアニメーションが実行されたときにのみ表示されます?

どのように解決するのですか?

冒頭の方法で実装するためには、まず最初に AnimationListener を追加して、アニメーションの開始と終了を検出できるようにします。フェードアウトの onAnimationEnd() が呼ばれたら、ImageView オブジェクトの可視性を View.INVISIBLE に設定し、画像を切り替えてフェードインアニメーションを開始することができます - ここでも別の AnimationListener が必要です。フェードインアニメーションのonAnimationEnd()を受信したら、ImageViewをView.VISIBLEに設定すれば、期待通りの効果が得られるはずです。

以前にも似たような効果を実装したことがありますが、その時は ViewSwitcher を使用しています。ViewSwitcherにフェードインとフェードアウトのアニメーションを設定し、AnimationListenerの実装を管理することができます。そうすれば、2つのImageViewを交互に表示させるだけです。

編集します。 もう少し役に立つように、ViewSwitcherの使い方の簡単な例を挙げます。私は完全なソースを以下の場所に含んでいます。 https://github.com/aldryd/imageswitcher .

activity_main.xml

    <ViewSwitcher
        android:id="@+id/switcher"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:inAnimation="@anim/fade_in"
        android:outAnimation="@anim/fade_out" >

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitCenter"
            android:src="@drawable/sunset" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitCenter"
            android:src="@drawable/clouds" />
    </ViewSwitcher>

MainActivity.java

    // Let the ViewSwitcher do the animation listening for you
    ((ViewSwitcher) findViewById(R.id.switcher)).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ViewSwitcher switcher = (ViewSwitcher) v;

            if (switcher.getDisplayedChild() == 0) {
                switcher.showNext();
            } else {
                switcher.showPrevious();
            }
        }
    });