2011-12-31 8 views
14

मैं हनीकॉम अनिश्चित प्रगति संकेतक के प्रभाव को प्राप्त करने के लिए एक ड्रॉबल के दो परतों को एनिमेट करने की कोशिश कर रहा हूं। एक्सएमएल बहुत सीधा है लेकिन ऐसा लगता है कि हनीकॉम से पहले प्लेटफॉर्म पर चलने पर केवल एक परत एनिमेट हो जाएगी।एनिमेट टू लेयर ड्रायबल आइटम प्री-हनीकॉम

<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

वास्तव में एक मंच सीमा है, हालांकि यह नहीं है कि आप क्या सोच सकते हैं। मुद्दा यह है कि प्री-एपीआई 11, RotateDrawable में कुछ क्रूड कोड था ताकि एनीमेशन toDegreesfromDegrees से अधिक था या नहीं, यह जांच कर घड़ी की दिशा में घूमता है; यदि नहीं, तो दोनों को एक दूसरे के बराबर मजबूर किया गया था। यदि आपने अपना उदाहरण संशोधित दिशा में स्थानांतरित करने के लिए अपना उदाहरण संशोधित किया है (0 से 720 तक, या यहां तक ​​कि -720 से 0 तक), दोनों छवियां सभी प्लेटफ़ॉर्म पर ठीक से एनिमेट करेंगी; हालांकि मुझे एहसास है कि आप जिस उद्देश्य के लिए लक्ष्य कर रहे हैं उसके उद्देश्य को हरा देता है।

कैश किए गए संस्करण पर एक नज़र डालें Google कोड्सशिप RotateDrawable.inflate() है, जो एक्सएमएल को ऑब्जेक्ट में बदलने के लिए प्रयुक्त विधि का 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 

यह दूसरा आइटम तुम वहाँ है कि जैसे एक एक्सएमएल ब्लॉक लेता है, और यह एक RotateDrawable उस के साथ समाप्त होता है में बदल जाता है fromDegrees और toDegrees (आपके मामले में, 720) के लिए एक ही मान, जिससे छवि अभी भी खड़ी हो सकती है। आप कुछ मूल्यों के लिए स्टार्ट वैल्यू को 360 से अधिक (जैसे 765) पर सेट करके इसे जांच सकते हैं। आप देखेंगे कि छवि अभी भी एनिमेट नहीं है, लेकिन प्रारंभिक समन्वय में घुमाया गया है।

यह अजीब चेक हनीकॉम/आईसीएस स्रोतों में हटा दी गई थी, यही कारण है कि आप उन प्लेटफार्मों पर पीछे की ओर घूर्णन कर सकते हैं। इसके अलावा, यह नहीं दिखता है जावा कोड से इन मूल्यों को निर्धारित करने के लिए एक रास्ता है, तो एक कस्टम 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

में हो सकता है की तरह त्वरित और गंदी समाधान इस प्राप्त करने के लिए की तरह लगता है पूर्व शहद में काम करना सिर्फ दूसरे घुमाव में से और फ्लिप करना है। यह आदर्श नहीं है लेकिन कम से कम चीज चारों ओर फैलती है (भले ही यह थोड़ी अधिक "उबाऊ" हो)। ऐसा लगता है कि एबीएस ने इसे हल किया है।

<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> 
संबंधित मुद्दे