1):
Existing answers on SOあなたはObjectAnimator
を使用したい場合は、あなたがアニメーション化するView
をサブクラス化するしかないでframeLayoutをサブクラス化...
を提案。基本的にgetterメソッドとsetterメソッドを呼び出してAnimation
を実行するので、ObjectAnimator
に必要なゲッターメソッドとセッターメソッドを提供する必要があります。
あなたは(Animate the transition between fragments)にリンクされている質問はsetXFraction()
とgetXFraction()
メソッドを追加するFrameLayout
をサブクラス化されます。これらは、FrameLayout
の幅を基準にx値を設定する方法で実装されています。これを行うことによってのみ、ObjectAnimator
は絶対値の間でアニメートする以外に何かを行うことができます。
要約すると、ObjectAnimator
自体は実際にはほとんどアニメーション化されていません。それは、リフレクションによってゲッターとセッターメソッドを呼び出すだけです。
xmlファイルに実際の画面のピクセルサイズ( ではなく)を取得する方法はありますか?
ObjectAnimator
では、これを達成する方法がありません。 ObjectAnimators
は開始値から終了値まで補間するだけです。上で説明したように、セッターメソッドは実際に何が起こるかを定義します。例えば
、コードのセットは、次に からそれが一定のアクセス、画面の幅に等しくする 定数を前記有し、幅は 微細あろう返すカスタム関数を呼び出す、またはコードを設定することができる定数を定義しますxmlも同様に便利です。
任意のxmlリソースにコードから値を挿入することはできません。あなたのxmlファイルに含まれるものは、ビルド時にAPKにコンパイルされ、は実行時にを変更できません。そして、これはあなたの他の質問に対する答えです。xmlでアクセス可能なリソースや定数、または現在の画面サイズを含むものはありません。アプリがインストールされているデバイスの画面サイズなどの動的な値は、その中のすべてがアプリを構築するときにアプリにコンパイルされるため、これらのリソースの一部にすることはできません。
2)解決策:ビューアニメーションが
一つの可能な解決策は、ObjectAnimator
するのではなく、ビューのアニメーションを使用することです。ビューのアニメーションを使用すると、だけでなく、絶対値の端数を指定することができます。これは、画面の高さの0%
に-100%
からView
をアニメーションう
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="-100%" android:toYDelta="0%" android:duration="1000"/>
</set>
。言い換えれば、完全に画面からView
の位置までです。
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_down);
view.startAnimation(animation);
これはあなたにとって役に立たないかもしれないと私は気付いています。 ObjectAnimators
を使用する必要があり、ビューアニメーションを使用できない場合があります。しかし、ビューアニメーションを使用できる限り、これはあなたの問題をかなり解決するはずです。
3)私たちは本当にここに取り組むべきであるどのようなベストプラクティス
は、私はあなたの部分の誤解と思われるものです。すでに気づいているように、xmlで定義したすべてのアニメーションには絶対的な開始値と終了値があります。これらの値は静的であり、アプリケーションのコンパイル後は変更できません。
多くの利用可能なセレクタとdp、spでリソースがどのように機能するかを見ると、1つのことを行うように設計されていることが分かります。
たとえば、 View
、100dp。 Dpは物理的なサイズの測定値であり、100dpは任意のピクセル密度の画面と全く同じ物理的なサイズになります。セレクタを使用すると、アニメーションによってView
が多すぎるか小さすぎるかもしれない、より小さいまたはより大きな画面のデバイスのこのアニメーションを変更できます。しかし、静的な値しか記入することはできません。セレクタの操作のほかに、各デバイスのアニメーションをカスタマイズすることはできません。
リソースは実際には静的で不変のもののために設計されています。ディメンションや文字列の変換には効果的ですが、アニメーションでは時には痛みがあります。上で述べたように、ビューアニメーションは、絶対値ではなく端数を指定するオプションを提供することで、静的な性質を取り巻く方法を提供します。しかし、一般的にxmlでは動的なものを定義することはできません。アニメーションに関するGoogleの優れたDevBytesの動画で、この引数の外観を裏付けるfutherする
:
これらの例では、xmlで1つのアニメーションしか定義されていません。確かに、彼らはxmlでそれらを定義しないと主張することができます。なぜなら、コードを説明して表示するのが楽になるからですが、私の意見ではこれがもう一度一つの点を証明します:
静的純粋に動的な値に依存するリソース
画面の幅と高さはデバイスごとに異なるため、デバイスごとに異なるアニメーションが必要です。ビューアニメーションだけでは、絶対値ではなく端数を定義できるので、それを回避する方法があります。それ以外の場合は、プログラムでアニメーションを定義する必要があります。幸いなことにはObjectAnimators
と難しいことではありません。
Animator animator = ObjectAnimator.ofFloat(view, View.X, startValue, endValue);
animator.start();
これは、ピクセル単位での終了値に最初からView
のx位置をアニメーション化します。
Animator animator = ObjectAnimator.ofFloat(view, View.X, -view.getWidth(), 0.0f);
animator.start();
これは左サイドからスライドさせるView
をアニメーション化します:あなたがしたいようにあなたはそれをアニメーション化するView
の幅に渡すことができます。それは画面から完全に始まり、最終位置で停止します。また、単にこれを行うことができます:
view.animate().x(targetValue);
これは、ターゲットのx値に、現在のx位置からView
をアニメーション化するでしょう。
でも、私は誤解しないでください。できるだけ多くのものをアニメーションやその他のリソースとして定義してください。ハードコーディングアニメーションやその他の値は、必要な場合を除き、可能な限り避けてください。
4)まとめ
だから、要約する:
- をあなたは、あなたがアニメーション化する
View
に必要なgetterメソッドとsetterメソッドを追加することなく、ObjectAnimators
とやりたいことができません。
- 可能であればview animationsを使用してください。それらを使用して、
View
の幅または高さの分数に基づいてアニメーションを定義できます。
- 上記が機能しない、または状況に該当しない場合は、アニメーションprogrammaticallyを定義してください。これはどんな場合でも動作します。
お手数ですがお気軽にお問い合わせください。
すばらしい答えをありがとう。大きな制限は、FragmentTransactionにアニメーションを追加する唯一の方法は、setCustomAnimations(int enter、int exit)であることです。そのAPIはAnimatorリソースIDではなく、AnimatorリソースIDを期待しているようです。アニメーターをコードで定義することは問題ありません。しかし、それにリソースIDを付けることはできますか? –
問題は解決しました。フラグメントのonCreateAnimatorメソッドでコードアニメーターを作成します。 –
私はちょうど 'onCreateAnimator()'についてあなたに伝えたいと思っています。あなた自身でそれを理解したと思います。私は助けることができてうれしい! –