2011-12-31 22 views
14

Honeycomb sonrası belirsiz ilerleme göstergesinin etkisini elde etmek için iki katmandan oluşan bir nesneyi canlandırmaya çalışıyorum. XML çok basittir ancak Honeycomb'dan önce platformlarda çalıştırıldığında sadece bir katmanın canlandırılacağı görülecektir.İki Katlı Çizgili Öğeleri Anında Önizleme Petek

<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> 

bu platformların bu sadece bir sınırlama mi yoksa istenen işlevselliği elde etmek için (genel olarak veya spesifik olarak önceden API11 hedeflenmiş) kullanan bir başka bir söz dizimi vardır?

cevap

11

Gerçekten de bir platform sınırlaması var, ancak düşündüğünüz gibi değil. Sorun, API1 öncesi, RotateDrawable'un, toDegrees'un fromDegrees'dan daha büyük olup olmadığını kontrol ederek, animasyonun saat yönünde döndürülmesini gerektirmesi için bazı ham kodlara sahip olmasıdır; değilse, ikisi birbirine eşit zorlandılar. Örneğinizi ikinci öğenin ileriye doğru hareket etmesi için değiştirdiyseniz (0 - 720, hatta -720 - 0), her iki görüntü de tüm platformlarda iyi animasyonlar yapar; bununla birlikte amaçladığın şeyin amacını yendiğini anladım.

Önbelleğe alınmış sürümüne göz atın Google Codesearch, XML'i nesneye dönüştürmek için kullanılan yöntemin 2.3 sürümü olan RotateDrawable.inflate() içeriyor ve ne demek istediğimi göreceksiniz.

RotateDrawable.java

... kusurlu kodu Bu orada var ikinci öğe gibi bir XML bloğunu alır

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 

... Satır 235 civarında olduğunu ve birlikte biter bir RotateDrawable haline döner fromDegrees ve toDegrees için aynı değer (sizin durumunuzda, 720), görüntünün sadece durmasına neden olur. Bunu, başlangıç ​​değerini, 360'ın (765 gibi) bir katı olmayan bir değere ayarlayarak bunu test edebilirsiniz. Görüntünün hala canlı olmadığını, ancak başlangıçtaki koordinatlara döndüğünü göreceksiniz. Bu garip denetim Honeycomb/ICS kaynaklarında kaldırıldı, bu yüzden bu platformlarda geriye doğru dönüş yapabilirsin. Orada Java kodu bu değerleri ayarlamak için bir yoldur, bu nedenle özel bir RotateDrawableCompat geleceğiniz :)

HTH

+1

İç işleyiş hakkında mükemmel bilgiler. Teşekkür ederim! –

+0

Güncelleme referans linki: https://github.com/android/platform_frameworks_base/blob/android-2.3.7_r1/graphics/java/android/graphics/drawable/RotateDrawable.java#L230-235 –

1

olabilir bu almak için hızlı ve kirli çözüm gibi görünüyor gibi Ayrıca, görünmüyor Ön bal peteği içinde çalışmak, sadece ikinci döndürme işleminde ve yana çevirmektir. Bu ideal değil ama en azından şey etrafa dönüyor (biraz daha "sıkıcı" olsa bile). ABS bu şekilde çözülmüş görünüyor.

<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>