web-dev-qa-db-ja.com

Android遅延を伴うアルファアニメーションフェードインフェードアウト

非常に単純なアルファアニメーションを実行したいのですが、有効な方法が見つかりません。

考え方は、ビュー上でこのアニメーションを実行することです:

  1. 1秒の0から1のアルファ
  2. アルファを1で5秒間保持します
  3. 1〜0の1秒のアルファ
  4. アルファを0に5秒間保持します。
  5. 1から再開します。

私はAnimationSetでそれを実装しようとしました:

AnimationSet animationSet = new AnimationSet(true);

Animation animation1 = new AnimationUtils.loadAnimation(this, Android.R.anim.fade_in);
animation1.setDuration(1000);

Animation animation2 = new AnimationUtils.loadAnimation(this, Android.R.anim.fade_out);
animation2.setDuration(1000);
animation2.setStartOffset(5000);

Animation animation3 = new AlphaAnimation(0.0f, 0.0f);
animation3.setDuration(4000)
animation3.setStartOffset(6000);

animationSet.add(animation1);
animationSet.add(animation2);
animationSet.add(animation3);

等..

しかし、3番目のアニメーションがすべてのアルファアニメーションを混乱させることは継ぎ目です。これにより、Androidこのタイプのアニメーションを管理する方法で内部の一貫性が失われると思います。

何か案が?

ありがとうございました。

36
zegnus

これを解決するために、これら2つの点に留意してください


  • 1秒のアニメーション期間で5秒後に_1.0f to 0.0f_をアニメーション化する場合、これは最終的には5秒のポーズで1秒のアニメーションになります。

    これを実現するには:

    1. setDuration(1000)(期間は1秒です)
    2. setStartOffset(5000)(5秒後に開始します)

  • 永遠にループする2つのアニメーションのみが必要です。

    1 ._0.0f to 1.0f_一時停止5秒、持続時間1秒

    2 ._1.0f to 0.0f_ポーズが5秒、持続時間が1秒


そして、ここにコードがあります:

_    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    textView.startAnimation(animation1);
_

ただし、繰り返しカウントするにはバグがあるため、永久にループするにはAnimationListenerを使用します。

_    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    //animation1 AnimationListener
    animation1.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation2 when animation1 ends (continue)
            textView.startAnimation(animation2);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    //animation2 AnimationListener
    animation2.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation1 when animation2 ends (repeat)
            textView.startAnimation(animation1);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    textView.startAnimation(animation1);
_
106
Sherif elKhatib

これにはもっと簡単な解決策があります。

ビューがGONE状態にあると仮定しましょう。可視性をアニメーション化するには:

yourView.setVisibility(View.VISIBLE);
yourView.animate().alpha(1).setDuration(300);

同じ方法で、アニメーションリスナーを追加できます。

これは、スケールアニメーションと翻訳アニメーションでも機能します。

17
amalBit