Androidでビューをアニメーション化し、新しい位置/サイズのままにする方法は?


81

現在、Androidアプリにビューがあり、ビューはフレームアニメーションを再生しています。ビューをアニメーション化して、サイズを150%に増やしたいと思います。スケールアニメーションを適用し、スケールアニメーションが完了したら、アクティビティのライフサイクルの残りの間、ビューアをその新しいサイズのままにしておく必要があります。残念ながら、現在、スケールアップアニメーションが完了すると、ビューは元のサイズに戻ります。新しいアニメーション変換を維持するにはどうすればよいですか?

使っています

myView.startAnimation(AnimationUtils.loadAnimation(mContext,R.anim.scaleUp150));

ありがとう!

回答:


150

アニメーションxmlのルート要素に以下の属性を追加してください。

android:fillAfter="true" 
android:fillEnabled="true"

7
これが本当の答えです。 OPは、これを受け入れられる回答に変更する必要があります。 Qlimaxありがとうございます!! (PSこれは開発ガイドの「アニメーション」セクションには記載されていません
。Animation

7
このコードをどこに置くか?<set ...></set>アニメーションタグ内またはアニメーションタグ内(translate| rotate| scale)?
xxxxxxxxxadfas 2011

5
以下で説明するように、それをセット
パラメータ

3
これは動作しません。ビューの実際のサイズをアニメーションで変更したい。内容を変更するだけです。スケールYを1.0から0.0に変更すると、アニメーションは発生しますが、ビューがあった場所に空のスペースが残ります。また、View.GONEを試しましたが、他のビューが空のスペースにスナップされます。スケーリングビューが縮小する間、他のビューがスケーリングビューのサイズに従う必要があります。それを機能させる方法は?
sudhanshu 2014

1
これを読んでいる他の人fillAfterは、実際のビューがまだ初期位置にある間だけビューピクセルを維持することに注意してください。LayoutParamsおそらくonAminationEnd(リスナー)でビューを手動で設定する必要があります。
ムハンマドババール2014年

52

コードからアニメーションを作成し、次のようにプロパティを設定してみてください

anim.setFillEnabled(true);
anim.setFillAfter(true);

しかし、新しい問題を作成しています、私はそれにタッチイベントを受け取ります。stackoverflow.com/questions/4728908/...
W00di

32

アニメーションをxmlに入れたい場合は、次のことが必要になる場合があります。

<set
android:fillEnabled="true"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
    android:fromYDelta="0"
    android:toYDelta="-20%p"
    android:duration="7000" />

</set>

https://stackoverflow.com/a/6519233/371749

他の答えにも感謝してください、 私を助けてくれました:)頑張ってください!


22

今日ではそれは非常に簡単になりました:

view.animate().x(valueX).y(valueY).setDuration(500).start();

(このスニペットでは、ViewPropertyAnimatorが使用されています)。

他の複数のオプションを追加することも可能です。

ビューは新しい位置に配置されます。


これはトレンドトピックとして投稿する必要があります
Kotik_o 2016

2

編集:Qlimaxの回答の方が優れていますが、OPが戻ってチェックマークを変更しておらず、承認された回答を削除できないため、ここにコピーします:fillAfter = true fillEnabled = trueを設定するだけです

私の元の答え(これは機能しますが、比較すると少しばかげています)は次のとおりです。

アニメーションの後で期待どおりに機能するには、少なくともこのスレッドによれば、onAnimationEndハンドラーを作成する必要があります。そこで、ビューの「実際の」(変換前の)境界を手動で調整して、の最終結果と一致させます。スケールアニメーション。


こんにちはウォルター。onAnimationEndを上書きしましたが、アニメーションのスケールに一致するようにビューの「実際の」境界を調整する方法がわかりません。最終的にどのdpを使用するかはわかりますが、「setWidth()」または「setHeight()」の関数が見つかりません。
justinl 2010

1
それらはLayoutParamsに保存されていると思います。あなたはできるはずですview.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();。(後者の呼び出しは、ビューツリーに再計算が必要であることを通知するために必要です。)
Walter Mundt 2010

2
これは、物事を行うための信じられないほど回りくどい方法です。属性android:fillEnabledを設定するだけでandroid:fillAfter、両方が真になります。
ニールトラフト2010

1

実際、使用しているアニメーションはAndroidフレームワークに埋め込まれているように見えるため、何かを変更できるかどうかはわかりません。
ただし、ドキュメントの例に従って独自のアニメーションを作成できます。また、アニメーションの終了後もスケーリングを維持したい場合は、android:fillAfter = "true"を設定する必要があります。


2
scaleUp150は、私がxmlで記述したカスタムアニメーションです(非常に基本的ですが)。android:fillAfter = "true"をアニメーション内に配置しましたが、元のサイズに戻ります:S
justinl 2010

1

android:fillAfter = "true"をSETタグに入れます-アニメーションタグに入れると、「遷移パラメーター」または「パラメーターのアニメーション化中/アニメーション中」に制限されます。SETのパラメータは、アニメーションの終了後に探している変換を適用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.