次の「数字」ウィジェットのいくつかのインスタンスで構成される単純なフリップクロック/カウンター/ティッカーウィジェットを実装しています:
背景画像の上に配置された数字です。数字は、上にスライドして次の数字を表示することにより、毎秒アニメーション化することになっています。アニメーション中、両方の数字が背景の境界内に留まる必要があります。
次の数字が完全に表示されるまで、TextView
2 行 (1 行に 1 桁) を使用し、 this の位置を上向きにアニメーション化することで、この動作を実現しようとしています。TextView
そして、TextView
s の位置をリセットし、両方の数字を同時に置き換えて、気付かないようにします。次に、このプロセスを繰り返して、アニメーションが終わらないように見せます。
ここでは、0 の一部と 9 の一部が表示されているアニメーションの中間状態を確認できます。layout_marginTop
プロパティを負の値に設定することにより、Eclipse のグラフィカル レイアウト エディタで「モック」しました。
これがレイアウト ファイルです (前述の属性は通常存在しません)。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="20dp"
android:layout_height="38dp"
android:background="@drawable/background_countdown_normal_grey"
android:clipChildren="false" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:paddingBottom="5dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/textview_countdown_digit"
style="@style/TextView.CountdownDigit"
android:layout_marginTop="-12dp"
android:text="0\n9" />
</LinearLayout>
</LinearLayout>
私は2つの解決策を試しました。ViewPropertyAnimator
または のいずれtranslateY
かで使用するy
と、スムーズなアニメーションが得られますが、 の元のクリッピングはTextView
アニメーション中に変化しないため、実際には 2 番目の数字が表示されることはありません。ご覧のとおり、clipChildren
プロパティを試してみましたが、何も変わらないようです。
私の 2 番目のアプローチは、 のを変更するValueAnimator
customを使用することでした。動作しますが、ハイエンド デバイスでもアニメーションが非常に不安定です。Evaluator
topMargin
LayoutParams
TextView
だから私の質問は、アニメーション中にビューのクリッピングを回避し、効率的な方法で行う方法ですか? より良いアプローチはありますか?