アニメーションを停止する方法(cancel()は機能しません)


244

実行中の翻訳アニメーションを停止する必要があります。の.cancel()方法はAnimation効果がありません。とにかくアニメーションは最後まで続きます。

実行中のアニメーションをどのようにキャンセルしますか?

回答:


508

clearAnimation()どちらに電話してもViewよろしいですかstartAnimation()


しかし、実際にはもう少し複雑なものが必要です。アニメーションが停止したとき、現在の位置に留まる必要があります。つまり、スライドする画像があり、タッチイベントでは、この場所でフリーズする必要があります。clearAnimation()はsetFillAfter(依存/終了位置を開始する状態をリセットするため)、そうではない
ミックス

1
@ user349871:setFillAfter()とにかく、おそらくあなたが思っていることをしないでしょう。タッチイベントが発生したら、アニメーションをクリアしてから、レイアウトを調整して、求めている永続的な変更に影響を与えます。
CommonsWare 2010年

わかりました、clearAnimation()を呼び出してアニメーションを停止しようとします。次のステップは、アニメーションを停止する前の位置を見つけることです。そのためのAPIは何ですか?
ミックス

@Mix:そのためのAPIはありません。
CommonsWare 2010年

7
また会ったね!アニメーションがキャンセルされたときに(補間時間に関して)ポイントを取得する方法を見つけました。Animationサブクラスを作成し、そこにAndroidコードアニメーションのコード(TranslateAnimationなど)を配置する必要があります。クラスでは、applyTransformation()関数で位置を保存および追跡できます。
2010年

40

Android 4.4.4では、ビューでアルファフェージングアニメーションを停止できる唯一の方法のように見えますView.animate().cancel()(つまり、.cancel()ビューのViewPropertyAnimator)。

ICSの前後の互換性のために使用しているコードは次のとおりです。

public void stopAnimation(View v) {
    v.clearAnimation();
    if (canCancelAnimation()) {
        v.animate().cancel();
    }
}

...メソッドを使用:

/**
 * Returns true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 * @return true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 */
public static boolean canCancelAnimation() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}

これが私が止めているアニメーションです:

v.setAlpha(0f);
v.setVisibility(View.VISIBLE);
// Animate the content view to 100% opacity, and clear any animation listener set on the view.
v.animate()
    .alpha(1f)
    .setDuration(animationDuration)
    .setListener(null);

.setListener(null);これは私を助けました。
ムハンマドサキブ2017

18

アニメーションリスナーを使用している場合は、を設定しv.setAnimationListener(null)ます。すべてのオプションで次のコードを使用します。

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);

2
これはv.setAnimation(null);で行われるため、呼び出す必要 はありません v.clearAnimation();
クリスチャン

@Christianが言ったように、v.setAnimation(null)は不要です
akshay bhange

5

.clearAnimation();を使用する必要があります。UIスレッドのメソッド:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        v.clearAnimation();
    }
});

3

あなたがしようとすることができるのは、それを止める前にアニメーションから変換マトリックスを取得し、マトリックスの内容を調べて探している位置の値を取得することです。

ここにあなたが調べなければならないAPIがあります

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

したがって、たとえば(いくつかの疑似コード。これはテストしていません):

Transformation outTransformation = new Transformation();
myAnimation.getTransformation(currentTime, outTransformation);
Matrix transformationMatrix = outTransformation.getMatrix();
float[] matrixValues = new float[9];
transformationMatrix.getValues(matrixValues);
float transX = matrixValues[Matrix.MTRANS_X];
float transY = matrixValues[Matrix.MTRANS_Y];

currentTimeはどこで取得しますか?
mako 2013

ああ、ドキュメンテーションはそれが「壁時計」に対応することを述べています、他の場所では壁時計をSystem.currentTimeMillis()として定義しています。これはカレンダー時間に対応し、ユーザーまたはネットワークによって時間が変更されるたびにジャンプします。使用する奇妙な尺度。
mako 2013

0

setAnimation(null)メソッドを使用してアニメーションを停止します。これはView.javaでパブリックメソッドとして公開され ます。これは、インタラクティブなUIコンポーネント(ボタン、テキストフィールドなど)の作成に使用されるすべてのウィジェットの基本クラスです。 /** * Sets the next animation to play for this view. * If you want the animation to play immediately, use * {@link #startAnimation(android.view.animation.Animation)} instead. * This method provides allows fine-grained * control over the start time and invalidation, but you * must make sure that 1) the animation has a start time set, and * 2) the view's parent (which controls animations on its children) * will be invalidated when the animation is supposed to * start. * * @param animation The next animation, or null. */ public void setAnimation(Animation animation)


0

アニメーションを停止するには、何もしないようなobjectAnimatorを設定します。

最初に手動で反転すると、左から右にアニメーションが表示されます。

flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);

その後、自動反転に切り替えたときにアニメーションはありません

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.