2010-09-21 15 views
28

मैं एक घूर्णन प्रगति छवि बनाना चाहता हूं, और आश्चर्य कीजिए कि आगे बढ़ने का सबसे अच्छा तरीका क्या है। मैं इसे एनीमेशन सूची के साथ काम कर सकता हूं उदाहरण के लिए 12 छवियां हर 100ms बदलती हैं। यह ठीक काम करता है, लेकिन यह काफी 12 चित्र बनाने के लिए कठिन है या हर आकार और संकल्प के लिए:छवि घूर्णन। एनीमेशन सूची या एनिमेटेड घुमावदार? (एंड्रॉइड)

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> 
<item android:drawable="@drawable/ic_loading_grey_on_black_01" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_02" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_03" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_04" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_05" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_06" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_07" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_08" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_09" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_10" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_11" android:duration="100" /> 
<item android:drawable="@drawable/ic_loading_grey_on_black_12" android:duration="100" /> 

मुझे लगता है कि एक आसान समाधान संकल्प प्रति एक छवि का उपयोग करने के लिए है, बल्कि प्रत्येक के लिए यह बारी बारी से फ्रेम। प्लेटफ़ॉर्म संसाधनों (एंड्रॉइड-एसडीके-विंडोज़/प्लेटफ़ॉर्म ...) में मुझे फ़ाइल को खींचने योग्य/search_spinner.xml में एनिमेटेड-रोटेट कहा जाता है, लेकिन अगर मैं कोड कॉपी करता हूं तो एंड्रॉइड के बारे में शिकायत करने वाला एक कंपाइलर त्रुटि प्राप्त होती है: framesCount और android: frameDuration (गूगल एपीआई 2.2 ग्रहण में):

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" 
android:drawable="@drawable/spinner_black_20" 
android:pivotX="50%" 
android:pivotY="50%" 
android:framesCount="12" 
android:frameDuration="100" /> 

मैं भी एक दोहरा घुमाने एनीमेशन (anim संसाधन फ़ोल्डर में उपयोग करते हुए) का उपयोग कर की कोशिश की है, लेकिन मैं वास्तव में एनीमेशन सूची संस्करण के रूप को पसंद करते हैं।

इस समस्या को हल करने का अनुशंसित तरीका क्या है?

कोड::

उत्तर

13

आप नीचे दिए गए जैसे एक drawable xml फ़ाइल बनाने के लिए

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" 
android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" 
android:toDegrees="360" android:drawable="@drawable/imagefile_to_rotate" /> 
+2

इसकी घूर्णन कैसे नहीं आती है? –

+0

यह कुछ डिवाइस पर काम नहीं करता है। कृपया – vuhung3990

2

देखने के लिए यहाँ उदाहरण http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/index.html

विशेष रूप से: प्रगति बार

  1. इंक्रीमेंटल बड़े और छोटे घूर्णन प्रगति संकेतकों को प्रदर्शित करता है जिन्हें इकाइयों में बढ़ाया या घटाया जा सकता है।
  2. चिकना एक सामान्य "व्यस्त" संदेश इंगित करने के लिए उपयोग किए जाने वाले बड़े और छोटे निरंतर घुमावदार प्रगति संकेतकों का प्रदर्शन करता है।
  3. संवाद प्रगति पट्टी होस्ट करने वाले पॉपअप संवाद, एक प्रोग्रेसडिअलॉग का प्रदर्शन करता है। यह उदाहरण प्रगति संकेतकों को निर्धारित और अनिश्चित दोनों दर्शाता है।
  4. शीर्षक बार विंडोपॉलिसी की प्रगति सूचक सुविधा को सेट करके लोड किए गए प्रगति संकेतक के साथ एक गतिविधि स्क्रीन का प्रदर्शन करता है।
0

एसएसीपीके का समाधान निश्चित रूप से काम करता है। एक और समाधान <animated-rotate> का उपयोग प्रश्न के समान ही हो सकता है और संकलक शिकायतकर्ताओं के लिए android:framesCount="12" android:frameDuration="100" विशेषताओं को हटा सकता है। यह अभी भी मेरी 8-फ्रेम छवि के लिए भी काम करता है।

हालांकि, मैं कैसे एनीमेशन :(की गति को नियंत्रित करने के लिए पता लगा havn't।

55

Rotate drawable प्रवीण ने सुझाव दिया फ्रेम गिनती का नियंत्रण नहीं देंगे। मान लेते हैं तो आप एक कस्टम लोडर को लागू करना चाहते हैं 8 वर्गों से होते हैं जो:

gif_icon

animation-list दृष्टिकोण का उपयोग करना, आप 8 फ्रेम 45*frameNumber डिग्री मैन्युअल तक घुमाया बनाना होगा।वैकल्पिक रूप से, आप इसे करने के 1 फ्रेम और सेट रोटेशन एनीमेशन का उपयोग कर सकते हैं:

progress_icon

फ़ाइल res/anim/progress_anim.xml:

<?xml version="1.0" encoding="utf-8"?> 
<rotate 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromDegrees="0" 
    android:toDegrees="360" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:repeatCount="infinite" /> 

फ़ाइल MainActivity.java

Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim); 
a.setDuration(1000); 
imageView.startAnimation(a); 

यह आपको बजाय चिकनी एनीमेशन दे देंगे 8-कदम रखा। इस हम कस्टम क्षेपक लागू करने की आवश्यकता को ठीक करने के लिए:

फ़ाइल res/values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="ProgressView"> 
     <attr name="frameCount" format="integer"/> 
     <attr name="duration" format="integer" /> 
    </declare-styleable> 
</resources> 

फ़ाइल ProgressView.java:

public class ProgressView extends ImageView { 

    public ProgressView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setAnimation(attrs); 
    } 

    public ProgressView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setAnimation(attrs); 
    } 

    public ProgressView(Context context) { 
     super(context); 
    } 

    private void setAnimation(AttributeSet attrs) { 
     TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ProgressView); 
     int frameCount = a.getInt(R.styleable.ProgressView_frameCount, 12); 
     int duration = a.getInt(R.styleable.ProgressView_duration, 1000); 
     a.recycle(); 

     setAnimation(frameCount, duration); 
    } 

    public void setAnimation(final int frameCount, final int duration) { 
     Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim); 
     a.setDuration(duration); 
     a.setInterpolator(new Interpolator() { 

      @Override 
      public float getInterpolation(float input) { 
       return (float)Math.floor(input*frameCount)/frameCount; 
      } 
     }); 
     startAnimation(a); 
    } 
} 

फ़ाइल

a.setInterpolator(new Interpolator() { 
    private final int frameCount = 8; 

    @Override 
    public float getInterpolation(float input) { 
     return (float)Math.floor(input*frameCount)/frameCount; 
    } 
}); 

इसके अलावा, आप एक कस्टम विजेट बना सकते हैं activity_main.xml:

<com.example.widget.ProgressView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_progress" 
    app:frameCount="8" 
    app:duration="1000"/> 

फ़ाइल res/anim/progress_anim.xml:

+0

महान के बजाय रोटेज का उपयोग करें, बहुत धन्यवाद –

+3

"धन्यवाद!", "मैं भी!", – Cephron

+0

मैं 'android: visibility =" अदृश्य "का उपयोग करके प्रगति दृश्य को छिपाने में सक्षम नहीं हूं? – Prateek

6

मैं vokilam का जवाब मिल गया सबसे अच्छा एक एक अच्छा कदम रखा/कंपित एनिमेशन बनाने के लिए होने के लिए ऊपर सूचीबद्ध। मैं अपने अंतिम सुझाव के लिए गया और एक कस्टम विजेट बनाया, मुझे सामना करने वाली एकमात्र समस्या यह थी कि सेटिंग दृश्यता काम नहीं करेगी क्योंकि यह एनिमेटेड थी और इस प्रकार हमेशा दिखाई देगी ...

मैंने अपना कोड समायोजित किया (ProgressView.java जो मैं StaggeredProgress.java) इस तरह का नाम बदला:

public class StaggeredProgress extends ImageView { 

private Animation staggered; 

public StaggeredProgress(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    setAnimation(attrs); 
} 

public StaggeredProgress(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setAnimation(attrs); 
} 

public StaggeredProgress(Context context) { 
    super(context); 
} 

private void setAnimation(AttributeSet attrs) { 
    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.StaggeredProgress); 
    int frameCount = a.getInt(R.styleable.StaggeredProgress_frameCount, 12); 
    int duration = a.getInt(R.styleable.StaggeredProgress_duration, 1000); 
    a.recycle(); 

    setAnimation(frameCount, duration); 
} 

public void setAnimation(final int frameCount, final int duration) { 
    Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim); 
    a.setDuration(duration); 
    a.setInterpolator(new Interpolator() { 

     @Override 
     public float getInterpolation(float input) { 
      return (float)Math.floor(input*frameCount)/frameCount; 
     } 
    }); 
    staggered = a; 
    //startAnimation(a); 
} 

@Override 
public void setVisibility(int visibility) { 
    super.setVisibility(visibility); 
    if(visibility == View.VISIBLE) 
     startAnimation(staggered); 
    else 
     clearAnimation(); 

} 


} 

इस तरह देखने की दृश्यता शुरू होता है स्थापित करने और आवश्यक ... बहुत धन्यवाद फिर से vokilam के रूप में एनिमेशन बंद!

संबंधित मुद्दे