52

PopupWindow に ScrollView があります。TranslateAnimation を使用して ScrollView コンテンツをアニメーション化しています。

アニメーションが開始すると、onAnimationStart リスナーが呼び出されますが、onAnimationEnd は呼び出されません。何か案は ?

レイアウト :

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:background="@drawable/popup_window_bg"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
  <View
     android:layout_width="@dimen/toolbar_padding_left"
     android:layout_height="@dimen/toolbar_height"/>
  <ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+web/toolbar"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:scrollbars="none"
     android:visibility="invisible">
    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">

       ...

    </LinearLayout>
  </ScrollView>
</LinearLayout>

アニメーション コード :

mToolbar = mPopupContents.findViewById( R.web.toolbar );
TranslateAnimation anim =
    new TranslateAnimation(0, 0, -60, 0);
anim.setDuration(1000);
anim.setAnimationListener(new Animation.AnimationListener() {
        public void onAnimationStart(Animation a) {
            Log.d(LOGTAG, "---- animation start listener called"  );
        }
        public void onAnimationRepeat(Animation a) {}
        public void onAnimationEnd(Animation a) {
            Log.d(LOGTAG, "---- animation end listener called"  );
        }
    });
mToolbar.startAnimation(anim);

更新: onAnimationEnd が呼び出されることを確認しましたが、少し遅れて呼び出されます (その間に新しいアニメーションを開始しない場合)。

4

15 に答える 15

62

AnimationEndは信頼できません。OnAnimationEnd をオーバーライドするカスタム ビューでコードを書き直したくない場合は、postDelayed.

コード例を次に示します。

final FadeUpAnimation anim = new FadeUpAnimation(v);
anim.setInterpolator(new AccelerateInterpolator());
anim.setDuration(1000);
anim.setFillAfter(true);
new Handler().postDelayed(new Runnable() {
    public void run() {
        v.clearAnimation();
        //Extra work goes here
    }
}, anim.getDuration());
v.startAnimation(anim);

見た目が悪いかもしれませんが、非常に信頼できるものであることは保証できます。他の行へのアニメーションで削除しながら、新しい行を挿入している ListViews に使用します。AnimationEnd を使用したリスナーのストレス テストは、信頼できないことが判明しました。AnimationEndトリガーされないこともありました。postDelayedアニメーションが完全に終了しなかった場合に備えて、関数内の変換を再適用することをお勧めしますが、それは使用しているアニメーションの種類によって異なります。

于 2012-12-14T14:54:19.517 に答える
10

USING view.startAnimation(Animation) AND NOT であることを確認してくださいview.setAnimation(Animation)。この単純な混乱が問題になる場合があります。

于 2015-03-13T02:55:59.873 に答える
10

投稿がどのように読まれたか、この問題の解決策を見つけるのに何日も費やしたかを覚えていない後、移動するオブジェクトが画面領域にない場合 (たとえば、画面座標の外に配置されている場合)、OnAnimationEnd コールバックが取得されないことがわかりました。呼ばれた。おそらくアニメーションは開始直後に失敗しますが(startメソッドが呼び出され、リスナーをコーディングしました)、logcatには何も書き込まれません。たぶんこれはあなたのケースではないかもしれませんが、これは最終的に私の問題を解決し、あなたにも役立つことを願っています.

于 2013-01-19T13:28:56.040 に答える
3

setFillAfter()また、アニメーションを使用する場合は、 to を忘れないでくださいtrue

http://developer.android.com/reference/android/view/animation/Animation.html#setFillAfter(ブール値)

fillAfter が true の場合、このアニメーションが実行した変換は、終了後も保持されます。設定されていない場合、デフォルトは false です。これは、AnimationSet を使用してアニメーションをチェーンする場合に適用されることに注意してください。変換は、AnimationSet 自体が開始する前に適用されません。

anim.setFillAfter(true);
mToolbar.startAnimation(anim);
于 2011-06-17T12:51:59.660 に答える
2

この質問に出くわした人は、代わりにプロパティ アニメーション システムの使用に切り替えることを検討してくださいhttp://developer.android.com/guide/topics/graphics/prop-animation.html

ビューのフェードイン/アウトを (AlphaAnimation を介して) アニメーション化する古い方法には、いくつかの問題がありました。OnAnimationEnd が呼び出されていなかったなど... Property Animation を使用すると、これらの問題はすべて解決されました。

API <11 デバイスをサポートしたい場合は、Jake Wharton のhttps://github.com/JakeWharton/NineOldAndroidsが最適です。

于 2014-10-26T16:30:11.007 に答える
0

私のように、多くのスタックオーバーフローの回答を読んでも、まだこの問題を抱えていて解決策が見つからない人がいるかもしれません!

私のケースは次のとおりですanimatorSet

  1. clearAnimation を呼び出すことができる単一のビューはありませんでした。
  2. 私は自分のアニメーションを backgroundThread から呼び出していませんでした。

解決策として、私はanimatorSet.end()直前に電話しましたanimatorSet.start()

于 2016-03-31T06:46:18.823 に答える
0

overridePendingAnimation(int,int) を使用してみてください。つまり、overridePendingAnimation(0,0)

デフォルトのアニメーションをオーバーライドし、View のオブジェクトを使用してメソッド startAnimation を呼び出すことにより、独自のアニメーションを定義できます。

これが私のコード例です。それがあなたに役立つかどうかはわかりません。

overridePendingTransition(0,0);
//finish();
v.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fadeout));
startActivity(new Intent(ContentManagerActivity.this,Mainmenu_activity.class));
overridePendingTransition(R.anim.fadein,0);
于 2011-09-08T07:39:42.760 に答える
0

遅延はおそらく anim.setDuration(1000) が原因であるか、スレッドでこれを実行している場合は、おそらくコンテキストの切り替えが原因です。遅延時間を操作してみて、違いに気付くかどうかを確認してください。

于 2011-08-29T06:21:59.273 に答える
-1

どこからアニメーションを始めますか?onCreateの場合、それは間違っています。onResumeで実行してみてください。

于 2011-04-07T08:56:24.003 に答える
-1

待っているアニメーションが終わる前に別のアニメーションを設定していませんか?

文脈がなければ、それがそのようなものであるかどうかを理解するのは難しいです...しかし、それはおそらくそれを引き起こす唯一のものの1つです.

于 2011-04-06T15:25:49.543 に答える
-1

アニメーションに setDuration を使用し、その中に 1000 ミリ秒を渡しているため、しばらくしてから呼び出されると思います。0 を渡すだけで、呼び出されるまでに時間がかかりません。

于 2011-06-27T14:09:41.840 に答える
-1

私はあなたのコードを試してみましたが、OnAnimation の開始時と inAmimationEnd でも正常に動作しています。持続時間の後は、アニメーションの終了後に onAnimationEnd が呼び出されることを意味するため、コードは正常に動作します

TranslateAnimation anim =new TranslateAnimation(0, 0, -60, 0);
        anim.setDuration(1000);     
        anim.setAnimationListener(new Animation.AnimationListener() {
                public void onAnimationStart(Animation a) {
                    Log.w("Start", "---- animation start listener called"  );
                }
                public void onAnimationRepeat(Animation a) {}
                public void onAnimationEnd(Animation a) {
                    Log.d(" end  ","---- animation end listener called"  );
                }
            });
            mIv.setAnimation(anim);
            mIv.startAnimation(anim);
于 2011-09-15T04:18:16.210 に答える