web-dev-qa-db-ja.com

Androidフェードイン/アウトのアニメーションで背景画像を変更する

5秒ごとにランダムに背景画像を変更できるコードを記述しました。今はフェードイン/アウトアニメーションを使用して背景画像を変更したいのですが、このアニメーションの使用方法がわかりません。

これは私のソースです:

void handlechange() {

    Handler hand = new Handler();
    hand.postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            // change image here
            change();

        }

        private void change() {
            // TODO Auto-generated method stub

            Random Rand = new Random();

            int index = Rand.nextInt(image_rundow.length);

            mapimg.setBackgroundResource(image_rundow[index]);

            handlechange();
        }
    }, 4000);

}

現時点ではすべてが大丈夫です。背景画像をランダムに変更できますが、アニメーションのフェードイン/フェードアウトを使用する方法がわかりません。

誰かが解決策を知っているなら、助けてください、ありがとう。

15
BekaKK

これらのコードを呼び出す必要があります。

まず、このようなフェードインとフェードアウトのアニメーション用に2つのxmlファイルを作成する必要があります。

fade_in.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:fillAfter="true"
        Android:duration="2000"
        />
</set>

fade_out.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:fillAfter="true"
        Android:duration="2000"
        />
</set>

次に、以下のようにimageViewのアニメーションを実行し、フェードインが終了したときにフェードアウトを変更するようにAnimationListenerを設定する必要があります。

Animation fadeOut = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_out);
imageView.startAnimation(fadeOut);

fadeOut.setAnimationListener(new Animation.AnimationListener() {
      @Override
      public void onAnimationStart(Animation animation) {
      }
      @Override
      public void onAnimationEnd(Animation animation) {
          Animation fadeIn = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_in);
          imageView.startAnimation(fadeIn);
      }
      @Override
      public void onAnimationRepeat(Animation animation) {
      }
});
19
kimkevin

フェードインアニメーションの場合、resフォルダーに「anim」という名前の新しいフォルダーを作成し、その中に次のコードで「fade_in.xml」を作成します

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <alpha
        Android:duration="@Android:integer/config_mediumAnimTime"
        Android:fromAlpha="0.0"
        Android:interpolator="@Android:anim/decelerate_interpolator"
        Android:toAlpha="1.0" />

</set>

このアニメーションをimageviewで実行するには、アクティビティで次のコードを使用します

Animation anim = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_in);
imageView.setAnimation(anim);
anim.start();

フェードアウトアニメーションの場合は、Android:fromAlphaとAndroid:toAlphaの値を交換するだけです

お役に立てれば。

5
akshay7692

RelativeLayoutを使用して、高さと幅の両方を設定する背景ビューの1つのレイヤーを追加できます。他のすべてのUI要素は、このビューの上に配置する必要があります。あなたのコードで。 fadeOutとfadeInアニメーションを定義します。 IDでその背景ビューを見つけて、次のようにします。

 xxxBackground.startAnimation(fadeOut);
 xxxBackground.setBackgroundResource(R.drawable.your_random_pic);
 xxxBackground.startAnimation(fadeIn);

補間を使用してパフォーマンスを調整できます。

2
Ziwei Zeng

アニメーション付きのAnimationDrawableが必要です。

最初のステップAnimationDrawable

-/res/anim/anim_Android.xmlファイルを作成します

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android"android:oneshot="false">
    <item Android:drawable="@drawable/Android_1"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_2"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_3"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_4"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_5"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_6"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_7"
          Android:duration="100"/>
</animation-list>

-ImageViewをAndroid:src = "@ anim/anim_Android"で追加します。

<ImageView
    Android:id="@+id/myanimation"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@anim/anim_Android" />

第二段階

-アクティビティでAnimationDrawableとAnimationを作成します

AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
            animationDrawable.setOneShot(true);
            animationDrawable.start();

    Animation animation = AnimationUtils.loadAnimation(YourActivity.this, Android.R.anim.fade_in);

    imageView.setAnimation(animation);
        animation.start();
        animation.setAnimationListener(new Animation.AnimationListener() {
          @Override
          public void onAnimationStart(Animation animation) {
          }
          @Override
          public void onAnimationEnd(Animation animation) {
              Animation fadeOut = AnimationUtils.loadAnimation(YourActivity.this, Android.R.anim.fade_out);
              imageView.startAnimation(fadeOut);
          }
          @Override
          public void onAnimationRepeat(Animation animation) {
          }
});

ハンドラーは必要ありません。

1
Cabezas

kimkevin で回答すると、Viewの背景ではなく、ImageViewTextViewViewなど)をアニメーション化します。つまり、Viewを強調表示するだけの場合は、その後ろに別のViewを追加し(backgroundViewと呼ぶことにします)、そのbackgroundViewをアニメーション化する必要があります。

ビューの背景をアニメーション化するには、次のコードを使用します

val startColor = view.solidColor
val endColor = ContextCompat.getColor(context, R.color.your_color)

val colorAnim = ObjectAnimator.ofInt(view, "backgroundColor", startColor, endColor, startColor)
colorAnim.duration = 2000
colorAnim.setEvaluator(ArgbEvaluator())
colorAnim.start()
1
Bugs Happen