2011-12-31 9 views
14

ハイドロブロック未確定の進行状況インジケーターの効果を得るために、描画可能な2つのレイヤーをアニメートしようとしています。 XMLは非常に単純ですが、Honeycombより前のプラットフォームで実行された場合、1つのレイヤーのみがアニメートされるように見えます。2つのレイヤー描画可能なアイテムをアニメーション化する前にハニカム

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <rotate 
      android:drawable="@drawable/abs__spinner_48_outer_holo" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:fromDegrees="0" 
      android:toDegrees="1080" /> 
    </item> 
    <item> 
     <rotate 
      android:drawable="@drawable/abs__spinner_48_inner_holo" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:fromDegrees="720" 
      android:toDegrees="0" /> 
    </item> 
</layer-list> 

は、これらのプラットフォームのこの単に制限であるか、私は、所望の機能を達成するために、(一般的にまたは特異的にプリAPI11をターゲットのいずれか)を使用することができ、代替構文がありますか?

答えて

11

実際にはプラットフォームの制限がありますが、それはあなたが考えるものではありません。問題は、pre-API11、RotateDrawableには、toDegreesfromDegreesより大きいかどうかをチェックしてアニメーションを時計回りに回転させることを要求するための粗コードが含まれていたことです。もしそうでなければ、両者は互いに平等に強制された。 2番目のアイテムを順方向(0〜720、さらには-720〜0)に移動するようにサンプルを変更した場合は、両方のイメージがすべてのプラットフォームで正常にアニメートされます。私があなたが目指している目的を破ることは分かっていますが。

Google Codesearchが持っているRotateDrawable.inflate()のキャッシュバージョンを見てください。このコードは、XMLをオブジェクトに変換するためのメソッドの2.3バージョンです。意味はわかります。

RotateDrawable.java ...問題のあるコードは、ライン235の周りにある...

float fromDegrees = a.getFloat(
      com.android.internal.R.styleable.RotateDrawable_fromDegrees, 0.0f); 
    float toDegrees = a.getFloat(
      com.android.internal.R.styleable.RotateDrawable_toDegrees, 360.0f); 

    toDegrees = Math.max(fromDegrees, toDegrees); //<--There's the culprit 

これは、あなたがそこに持っている2番目の項目のようなXMLブロックを取り、で終わるRotateDrawableに変換しますfromDegreestoDegrees(あなたの場合は720)と同じ値になるため、画像は単に停止します。開始値を360の倍数ではなく(765のような)ある値に設定することで、これを目で見ることができます。イメージはまだアニメーション化されていませんが、最初の座標に回転しています。

この厄介なチェックはHoneycomb/ICSソースでは削除されています。そのため、これらのプラットフォームで逆転を行うことができます。そこにJavaコードからこれらの値を設定する方法ですので、カスタムRotateDrawableCompatは、あなたの将来:)

HTH

+1

内部の仕組みに優れた洞察力。ありがとうございました! –

+0

更新された参照リンク:https://github.com/android/platform_frameworks_base/blob/android-2.3.7_r1/graphics/java/android/graphics/drawable/RotateDrawable.java#L230-235 –

1

であってもよく、これを取得するために迅速かつ汚いソリューションのように思えるように。また、それは見ていません前ハニカムで作業するのは、2番目の回転で前後に反転することです。これは理想的ではありませんが、少なくとも、物事は(ちょっと退屈だとしても)スピンします。これは、ABSがそれを解決した方法です。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <rotate 
      android:drawable="@drawable/abs__spinner_48_outer_holo" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:fromDegrees="0" 
      android:toDegrees="1080" /> 
    </item> 
    <item> 
     <rotate 
      android:drawable="@drawable/abs__spinner_48_inner_holo" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:fromDegrees="0" 
      android:toDegrees="720" /> <!-- Like this --> 
    </item> 
    </layer-list> 
関連する問題