Android एनीमेशन दोहराता नहीं है


85

मैं सरल एनीमेशन बनाने की कोशिश कर रहा हूं जो कई बार (या असीम रूप से) दोहराएगा।
ऐसा लगता है कि android:repeatCountकाम नहीं करता है!
यहाँ से मेरा एनीमेशन संसाधन है /res/anim/first_animation.xml:

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:repeatCount="infinite"
    >
    <scale
        android:interpolator="@android:anim/decelerate_interpolator"
        android:duration="500"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="1.2"
        android:toYScale="1.2"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false" />
    <scale
        android:interpolator="@android:anim/accelerate_interpolator"
        android:startOffset="500"
        android:duration="500"
        android:fromXScale="1.2"
        android:fromYScale="1.2"
        android:toXScale="1.0"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false" />
</set>

पहले इसे 500 एमएस में 1.0 से 1.2 के आकार का चित्र बनाना चाहिए।
और फिर इसे 500 एमएस में 1.0 के पैमाने पर वापस करें।
यहां बताया गया है कि मैं इसका उपयोग कैसे कर रहा हूं:

Animation firstAnimation = AnimationUtils.loadAnimation(this, R.anim.first_animation);
imgView.startAnimation(firstAnimation);

यह एक चक्र बनाता है और फिर खत्म होता है।
यह ऊपर तराजू, फिर तराजू नीचे ans तो बंद हो जाता है।

मैं इस काम को कैसे बना सकता हूं?


यहाँ आपके java code में imgView क्या है?
क्लिफग्रे

जवाबों:


63

अद्यतन: सितम्बर, 2011 में वापस एक एंड्रॉइड इंजीनियर ने इस मुद्दे को सबसे अधिक भाग के लिए तय किया। XML में जिन विशेषताओं को अनदेखा किया गया था, वे अब अपवाद के साथ काम करती हैं repeatCountऔर fillEnabledजिन्हें अभी भी अनदेखा किया गया है (किसी कारण के लिए)। इसका मतलब यह है कि AnimationSetदुर्भाग्य से दोहराना अब भी आसान नहीं है ।

जानकारी के लिए कृपया अपडेट किए गए डॉक्स में ओवरव्यू देखें (बताते हैं कि किन विशेषताओं को अनदेखा किया गया है, कौन से काम किए गए हैं, और कौन से बच्चों को पास किए गए हैं)। और क्या की एक गहरी समझ के लिए fillAfter, fillBeforeऔर fillEnabledवास्तव में करते हैं, इसके बारे में इंजीनियर की (चेट हासे) ब्लॉग पोस्ट देखें यहाँ


मूल उत्तर

पावेल और अन्य लोगों के जवाब पर विस्तार करने के लिए: यह सच है कि <set>टैग हास्यास्पद रूप से छोटी गाड़ी है। यह repeatCountकई अन्य विशेषताओं के साथ सही ढंग से व्यवहार नहीं कर सकता है ।

मैंने कुछ घंटे बिताए और सोचा कि यह क्या कर सकता है और क्या नहीं कर सकता और एक बग रिपोर्ट / मुद्दा यहाँ प्रस्तुत किया है: अंक 17662

सारांश में (यह चिंताएं हैं AnimationSet):

setRepeatCount () / android: दोहराएं

यह विशेषता (साथ ही रिपीटमोड) कोड या एक्सएमएल में काम नहीं करती है। यह एनिमेशन के पूरे सेट को दोहराना कठिन बना देता है।

setDuration () / android: अवधि

कोड में काम करता है एक एनिमेशनसेट पर यह काम करता है (बच्चों के सभी एनिमेशन को ओवरराइड करता है), लेकिन XML में टैग में शामिल नहीं होने पर

setFillAfter () / android: fillAfter

यह टैग के लिए कोड और XML दोनों में काम करता है। अजीब बात है कि मैंने इसे सही से भरने के लिए काम करने की आवश्यकता के बिना भी काम किया है।

setFillBefore () / android: fillBefore

कोड और एक्सएमएल दोनों में कोई प्रभाव / अनदेखी नहीं करता है

setFillEnabled () / android: fillEnabled

कोड और एक्सएमएल दोनों में कोई प्रभाव / अनदेखी नहीं करता है। मैं अभी भी fillAnabled शामिल करने या झूठे को भरने के बिना भी काम करने के लिए fillAfter प्राप्त कर सकता हूं।

setStartOffset () / android: startOffset

यह केवल कोड में काम करता है ना कि XML में।


48

मैंने पाया है कि <सेट> टैग में एनीमेशन एनिमेशन क्लास में बगिया कार्यान्वयन है ।
यह रिपीटाउंट के साथ सही तरीके से नहीं निपट सकता ।
हम क्या कर सकते हैं - रिपीटाउंट को सीधे <स्केल> टैग में सेट करना है

यह XML संसाधन अच्छी तरह से काम कर रहा है:

<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:duration="200"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="1.05"
    android:toYScale="1.05"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatMode="reverse"
    android:fillAfter="false"
    android:repeatCount="24"
/>

दुर्भाग्य से, यह एक बार में केवल एक एनीमेशन तक सीमित है।
हम एनिमेशन के एक क्रम को इस तरह परिभाषित नहीं कर सकते हैं ...


मैं एक सेट में 2 एनीमेशन चला रहा हूं और वे मुझे कोई समस्या नहीं दे रहे हैं। कृपया मुझे बताएं कि आप किस समस्या के बारे में बात कर रहे हैं? कौन सा बग? वर्तमान में 1.6 sdk
AZ_

Xml कार्यों में बार-बार घोषणा की जा रही है, लेकिन कोड में नहीं
onmyway133

39

आपको विशेषता को शामिल करना चाहिए

android:repeatCount="infinite"

लेकिन आपके "स्केल" एनीमेशन में "सेट" नहीं


1
लेकिन क्या ये एनिमेशन पहले से ही पूरा होने का इंतजार करेंगे? धन्यवाद
filthy_wizard

धन्यवाद, यह काम किया! इसे प्रोग्रामेटिक रूप से सेट करना जो भी कारण हो।
चेरी-वेव

धन्यवाद! यह काम किया। लेकिन यह निरंतर है। क्या हर 5 सेकंड में ऐसा होना संभव है?
d34th4ck3r

32

दोहराए जाने वाले एनीमेशन को प्राप्त करने के लिए मैंने एनीमेशन श्रोता का उपयोग किया, और एनीमेशन को फिर से समाप्त होने पर बुलाया। यह ब्रैकेट के साथ एनीमेशन की तरह फोकस करने वाला कैमरा रेटिकुल करता है।

यहाँ एनीमेशन लेआउट xml है

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
    android:fromXScale="1.0"
    android:toXScale=".7"
    android:fromYScale="1.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toYScale=".7"
    android:duration="1000"/>
<scale 
    android:duration="1000"
    android:fromXScale=".7"
    android:toXScale="1.0"
    android:fromYScale=".7"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toYScale="1.0"
    android:startOffset="1000"/>

</set>

यहाँ जावा कोड है

 public void startAnimation() {

            View brackets = findViewById(R.id.brackets);
            brackets.setVisibility(View.VISIBLE);

            Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
            anim.setAnimationListener(new AnimationListener() {

                @Override
                public void onAnimationEnd(Animation arg0) {
                    Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
                    anim.setAnimationListener(this);
                    brackets.startAnimation(anim);

                }

                @Override
                public void onAnimationRepeat(Animation arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onAnimationStart(Animation arg0) {
                    // TODO Auto-generated method stub

                }

            });


            brackets.startAnimation(anim);
}

2
हां यह सही उत्तर होना चाहिए। सभी उपकरण और OS स्तर में काम करना
Smeet

इसने मेरी भी मदद की, लेकिन मैंने इन दोनों लाइनों को एंड मेथड एनिमेशन एनिमेशन = एनिमेशनयूलेट्स.लोडअनिमेशन (BuzzFinderActivity.this, R.anim.crosshair_focusing) से हटा दिया; anim.setAnimationListener (this);
ऐदा

10

मैं भी इसी समस्या का सामना कर रहा था .. मैंने android: repeatCount = "अनंत" को एक्सएमएल फ़ाइल में शामिल किया है..जबकि इसके ठीक काम ...

  <translate 
           android:fromXDelta="0"
           android:toXDelta="80"
           android:duration="1000"
           android:repeatCount="infinite"   
           android:repeatMode="reverse" 
           android:pivotX="50%"
           android:pivotY="50%"                             
           android:fillAfter="true"/>


9

आप इस कोड को आज़मा सकते हैं। अपने कोड में बस जोड़ें,

firstAnimation.setRepeatCount(5);

यह निश्चित समय के लिए एनीमेशन को दोहराएगा

firstAnimation.setRepeatCount(Animation.INFINITE);
firstAnimation.setRepeatMode(Animation.INFINITE);

यह एनीमेशन को अनिश्चित काल तक दोहराएगा।


4
repeatModeRESTARTया तो होना चाहिए याREVERSE
xinthink

बिल्कुल वही जो मैं चाहता हूँ, अनन्तता के लिए गतिशील रूप से सेट।
वरुण चौधरी


4

मैंने एनीमेशन की सटीक संख्या दिखाने के लिए डैनियल कोड का उपयोग करने की कोशिश की और एक समस्या थी: एनीमेशन को अनुमानित रूप से n / 2 बार दिखाया गया था, जब n समय की उम्मीद थी।

इसलिए मैंने डैनियल का कोड संशोधित किया है:

//...
@Override
public void onAnimationEnd(Animation arg0) {
    mCurrentCount++;
    if (mCurrentCount < REPEAT_COUNT) {  
        Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
        anim.setAnimationListener(this);
        brackets.post(new Runnable() {
            @Override
            public void run() {
                brackets.startAnimation(anim);
            }
        }  
    } 
}
//... 

ऊपर दिखाए गए वेरिएंट का उपयोग करते हुए, एनीमेशन को बहुत तेजी से REPEAT_COUNT बार दिखाया जाता है, क्योंकि View.post () विधि पिछले एनीमेशन से संबंधित सभी कार्यों को पूरा करने के बाद नए एनीमेशन को शुरू करने की क्षमता देती है।


3

आपको अपने xml कोड में सिर्फ एक लाइन जोड़ना है जो मैंने नीचे सुझाया है।

<scale
    android:duration="500"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="1.2"
    android:toYScale="1.2"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite" // just add this one line 
    android:fillAfter="false"
    />
</set>

2

Android एसडीके संस्करण के साथ 4.0.3:

दिए गए एनीमेशन तत्वों में:

एंड्रॉयड: repeatCount = "- 1"

यह एक अनंत एनीमेशन बनाता है।


धन्यवाद! यह बिना किसी वर्कअराउंड के 4.2 पर ठीक काम करता है
17

2

अपनी परियोजना में निम्न वर्ग जोड़ें:

import android.view.View;
import android.view.animation.Animation;

public class AnimationRepeater implements Animation.AnimationListener
{
    private View view;
    private Animation animation;
    private int count;

    public AnimationRepeater(View view, Animation animation)
    {
        this.view = view;
        this.animation = animation;
        this.count = -1;
    }

    public AnimationRepeater(View view, Animation animation, int count)
    {
        this.view = view;
        this.animation = animation;
        this.count = count;
    }

    public void start()
    {
        this.view.startAnimation(this.animation);
        this.animation.setAnimationListener(this);
    }

    @Override
    public void onAnimationStart(Animation animation) { }

    @Override
    public void onAnimationEnd(Animation animation)
    {
        if (this.count == -1)
            this.view.startAnimation(animation);
        else
        {
            if (count - 1 >= 0)
            {
                this.animation.start();
                count --;
            }
        }
    }

    @Override
    public void onAnimationRepeat(Animation animation) { }
}

अपने दृश्य के अनंत लूप के लिए, निम्नलिखित करें:

Animation a = AnimationUtils(Context, R.anim.animation);
new AnimationRepeater(View, a).start();

यदि आप केवल एन-बार के लिए एनीमेशन दोहराना चाहते हैं, तो निम्न कार्य करें:

Animation a = AnimationUtils(Context, R.anim.animation);
new AnimationRepeater(View, a, int N).start();

एन का अर्थ दोहराव की संख्या है।


2

मैंने android:repeatMode="reverse"अपने प्रोजेक्ट में पहले उपयोग करके इस समस्या को हल किया ।

<scale
    android:interpolator="@android:anim/decelerate_interpolator"
    android:duration="500"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="1.2"
    android:toYScale="1.2"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatMode="reverse"
    android:repeatCount="infinite" />

1

मैं अपने अधिकांश सामान को प्रोग्रामेटिक रूप से करता हूं और इस एक पर मुझे देर हो सकती है या अक्षम हो सकती है लेकिन यह मैंने दोहराए गए एनिमेशन लक्ष्य को पूरा किया (मेरे पास 2 वैकल्पिक एनीमेशन सेट भी हैं)। यह सब कोड बस एक छवि में फीका है, रुकें, फिर बाहर फीका करें, एक और छवि में फीका करें, रुकें, फीका करें, और पहले एक को वापस लाएं (कुल्ला और दोहराएं)। मैंने पहली बार अपने चित्र साक्षात्कार को परिभाषित किया:

    final ImageView purple = (ImageView)findViewById(R.id.purp);
    final ImageView yellow = (ImageView)findViewById(R.id.yell);
    purple.setVisibility(View.INVISIBLE);
    yellow.setVisibility(View.INVISIBLE);

तब मैंने दो एनीमेशन, टास्क टाइमर्स और हैंडलर बनाए, जिनसे निपटने के लिए प्रत्येक एनीमेशन को शुरू और बंद करना चाहिए:

    Timer p = new Timer();
    TimerTask pu = new TimerTask() {
        public void run() {
                handler1.post(new Runnable() {
                        public void run() 
                        {
                           fadein(purple);
                        }
               });
        }};
        p.schedule(pu, 6000, 12000);

    final Handler handler2 = new Handler();

    Timer y = new Timer();
    TimerTask ye = new TimerTask() {
        public void run() {
                handler2.post(new Runnable() {
                        public void run() 
                        {
                           fadein(yellow);
                        }
               });
        }};

        y.schedule(ye, 0, 12000);

अंत में, एनिमेशन को जोड़कर एनीमेशन सेट बनाने के बजाय, मैं केवल एनिमेशन को सुनने के लिए यह निर्धारित करने के लिए श्रोताओं का एनिमेशन करता हूं:

public void fadein (final ImageView image)
{
    Animation anim = new AlphaAnimation(0, 1);

    anim.setDuration(2000);

    image.startAnimation(anim);
    anim.setAnimationListener(new AnimationListener() {
        public void onAnimationEnd(Animation animation) 
        {
            image.clearAnimation();
            image.invalidate();
            pause(image);

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }
    });
}    
public void pause (final ImageView image)
{
    Animation anim = new AlphaAnimation(1, 1);

    anim.setDuration(2000);

    image.startAnimation(anim);
    anim.setAnimationListener(new AnimationListener() {
        public void onAnimationEnd(Animation animation) 
        {
            image.clearAnimation();
            image.invalidate();
            fadeout(image);

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }
    });
}     
public void fadeout (final ImageView image)
{
    Animation anim = new AlphaAnimation(1,0);

    anim.setDuration(2000);

    image.startAnimation(anim);
    anim.setAnimationListener(new AnimationListener() {
        public void onAnimationEnd(Animation animation) 
        {
            image.clearAnimation();
            image.invalidate();
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }
    });
}    

स्पष्टता और अमान्य जहाँ सिर्फ पिछले प्रयास और सही काम करने के लिए इस चीज़ को प्राप्त करना। मुझे नहीं पता कि वे आवश्यक हैं या नहीं।

आशा है कि यह किसी की मदद करता है।


रयान


1

मुझे यह जाने के लिए मिला ... मैं लगातार एक सर्कल में घूमने के लिए एक दृश्य प्राप्त करने की कोशिश कर रहा था।

इससे पहले मैं रोटेशन का उपयोग कर रहा था। RsetRepeatMode (-1) लेकिन यह काम नहीं किया। setrepeatcount पर स्विच किया गया और यह काम करता है। यह जेली बीन 4.2.2 पर है

 ObjectAnimator rotation = ObjectAnimator.ofFloat(myview,
                          "rotation", 360).setDuration(2000);
                rotation.setRepeatMode(-1);
          rotation.setRepeatCount(Animation.INFINITE); 
 rotation.start();

0

मैंने एक ही समस्या का सामना किया है, लेकिन जावा में किसी भी टाइमिंग चीज़ को नहीं करना चाहता था क्योंकि यूआई थ्रेड कभी-कभी बहुत व्यस्त हो सकता है। INFINITE ध्वज सेट टैग के लिए काम नहीं करता है। इसलिए मैंने कोड के एक छोटे से टुकड़े के साथ समस्या को हल किया:

mAnimation = (AnimationSet) AnimationUtils.loadAnimation(myContext, R.anim.blink);
mIcon.startAnimation(mAnimation);
mAnimation.setAnimationListener(new AnimationListener() {
    public void onAnimationStart(Animation animation) {}
    public void onAnimationRepeat(Animation animation) {}
    public void onAnimationEnd(Animation animation) {
        mIcon.startAnimation(mAnimation);
    }
});

निम्नलिखित XML के साथ:

<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />

<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromAlpha="0.9"
    android:startOffset="1000"
    android:toAlpha="0.0" />

जहां mIcon मेरे लेआउट से एक ImageView है।


0

मैंने इस समस्या को हल कर दिया है। यह फिक्स का मेरा संस्करण है:

public class HelloAndroidActivity extends Activity {
private static String TAG = "animTest";
private Animation scaleAnimation;
private int currentCover = 0;
private List<ImageView> imageViews = new ArrayList<ImageView>(3);
private Button btn;
private ImageView img;

/**
 * Called when the activity is first created.
 * @param savedInstanceState If the activity is being re-initialized after 
 * previously being shut down then this Bundle contains the data it most 
 * recently supplied in onSaveInstanceState(Bundle). <b>Note: Otherwise it is null.</b>
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate");
    setContentView(R.layout.test);

    img = (ImageView)findViewById(R.id.testpict);
    imageViews.add(img);
    img = (ImageView)findViewById(R.id.testpictTwo);
    imageViews.add(img);
    img = (ImageView)findViewById(R.id.testpict3);
    imageViews.add(img);

    scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.photo_scale);
    scaleAnimation.setAnimationListener(new CyclicAnimationListener());

    btn = (Button)findViewById(R.id.startBtn);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            imageViews.get(0).startAnimation(scaleAnimation);
        }
    });



}

private class CyclicAnimationListener implements AnimationListener{

    @Override
    public void onAnimationEnd(Animation animation) {
        currentCover += 1;
        if(currentCover >= imageViews.size()){
            currentCover = 0;
        }
        img = imageViews.get(currentCover);
        scaleAnimation = AnimationUtils.loadAnimation(HelloAndroidActivity.this, R.anim.photo_scale);
        scaleAnimation.setAnimationListener(new CyclicAnimationListener());
        img.startAnimation(scaleAnimation);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        Log.d("Animation", "Repeat");
    }

    @Override
    public void onAnimationStart(Animation animation) {

    }

}

}

0

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

, एनिमेशनऑपर, वर्ग, यहां उपलब्ध है: https://gist.github.com/2018678


0

इंटरनेट से जवाब के माध्यम से शोध करने के बाद, मुझे एक समाधान मिला जो मेरे लिए पूरी तरह से काम करता है। (और हाँ, रिपीटाउंट और रिपीटमोड अत्यंत छोटी गाड़ी है जब एनीमेशनसेट के साथ प्रयोग किया जाता है)।

anim_rotate_fade.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:ordering="together" >

    <objectAnimator
        android:duration="3000"
        android:propertyName="rotation"
        android:repeatCount="1"
        android:valueTo="360"
        android:valueType="floatType" />

    <objectAnimator
        android:duration="3000"
        android:propertyName="alpha"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:valueFrom="0.0"
        android:valueTo="0.3"
        android:valueType="floatType" />

    <objectAnimator
        android:duration="3000"
        android:propertyName="y"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:valueFrom="380"
        android:valueTo="430"
        android:valueType="floatType" />

</set>

गतिविधि में: (एनीमेशन समाप्त होने के बाद थोड़ी देरी शुरू करके इसे हल करें)।

ImageView starlightImageView = new ImageView(this);
starlightImageView.setImageResource(R.drawable.starlight);
final AnimatorSet animate = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.anim.anim_rotate_fade);
AnimatorListenerAdapter animatorListener = new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                animate.start();
            }
        }, 1000);
    }
};
animate.setTarget(starlightImageView);
animate.addListener(animatorListener);

ऐसी बहुत सी कक्षाएं हैं जिन पर आप शोध करना चाहते हैं, लेकिन वर्तमान में मैं ऑब्जेक्ट एनीमेटर का उपयोग कर रहा हूं, जो अत्यधिक लचीला है। मैं एनिमेशन या एनिमेशन यूटिल्स का उपयोग करने की अनुशंसा नहीं करूंगा:

  • एनीमेशन
  • AnimationUtils
  • एनिमेटर
  • AnimatorInflater
  • AnimatorListener
  • AnimatorListenerAdapter


0

@Danufr का थोड़ा सा ट्विन संसाधनों को फिर से लोड होने से बचाने के लिए उत्तर दें।

    operator = (ImageView) findViewById(R.id.operator_loading);
  final  Animation ani = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.finding_operator);


    ani.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {

            operator.startAnimation(ani);

        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });

    operator.setAnimation(ani);

0

मैंने थ्रेड का उपयोग करके इस समस्या को हल किया।

Button btn = (Button) findViewById(R.id.buttonpush);
    final TextView textview = (TextView) findViewById(R.id.hello);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            textview.setText("...................");
            final Animation animationtest = AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.slide_in_left);
            animationtest.setDuration(1000);

            final Handler handler = new Handler();
            Runnable runnable = new Runnable() {
                public void run() {
                    handler.postDelayed(this, 1500);
                    textview.startAnimation(animationtest);
                }
            };
            handler.postDelayed(runnable, 500); // start
            handler.removeCallbacks(runnable); //STOP Timer

        }
    });


0

उपरोक्त किसी भी समाधान ने मेरे मामले में काम नहीं किया। Danuofr द्वारा समाधान एनीमेशन सेट के लिए काम किया था, लेकिन जब मैं यूनिट परीक्षण कर रहा था, मेरे परीक्षण इस अनंत लूप में फंस जाते थे। अंत में, मेरे मामले के लिए विशिष्ट, मुझे इस एनीमेशन की विशिष्ट संख्या को दोहराने की आवश्यकता थी। इसलिए, मैंने ऑफ़सेट वैल्यू को जोड़कर अपने एनीमेशन की प्रतियों को एनिमेटिड रूप से anim_rot.xml में जोड़ दिया । मुझे पता है कि यह खराब है और कई के लिए काम नहीं करेगा, लेकिन यह मेरे मामले के लिए एकमात्र समाधान था।

anim_rot.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="2000"
        android:fromDegrees="20"
        android:pivotX="29%"
        android:pivotY="50%"
        android:toDegrees="-20" />
    <rotate
        android:duration="2000"
        android:fromDegrees="-20"
        android:pivotX="29%"
        android:pivotY="53%"
        android:startOffset="2000"
        android:toDegrees="20" />
    <rotate
        android:startOffset="4000"
        android:duration="2000"
        android:fromDegrees="20"
        android:pivotX="29%"
        android:pivotY="56%"
        android:toDegrees="-20" />
    <rotate
        android:duration="2000"
        android:fromDegrees="-20"
        android:pivotX="29%"
        android:pivotY="59%"
        android:startOffset="6000"
        android:toDegrees="20" />
    <rotate
        android:startOffset="8000"
        android:duration="2000"
        android:fromDegrees="20"
        android:pivotX="29%"
        android:pivotY="62%"
        android:toDegrees="-20" />
    <rotate
        android:duration="2000"
        android:fromDegrees="-20"
        android:pivotX="29%"
        android:pivotY="65%"
        android:startOffset="10000"
        android:toDegrees="20" />
</set>

मैंने ऐसा एनिमेशन को 3 बार दोहराने के लिए किया। ऑफसेट मूल्यों को जोड़कर आप इसे विशिष्ट समय में दोहराने के लिए अधिक प्रतियां जोड़ सकते हैं।


-1

कोड को लूपिंग थ्रेड या कथन के लिए / थोड़ी देर में जोड़ने का प्रयास करें


खैर, एकमात्र समाधान मैंने पाया है कि सेट टैग का उपयोग करने से बचें।
पावेल चेर्नोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.