অ্যান্ড্রয়েড অ্যানিমেশন পুনরাবৃত্তি করে না


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

এটি একটি চক্র তৈরি করে এবং তারপরে শেষ হয়।
এটি স্কেল আপ করে, তারপরে স্কেল করে উত্তরগুলি পরে থামে।

আমি কীভাবে এই কাজটি ইচ্ছাকৃত করতে পারি?


আপনার জাভা কোডে এখানে আইএমজিভিউ কী?
clifgray

উত্তর:


63

আপডেট: ২০১১ সালের সেপ্টেম্বরে, একজন অ্যান্ড্রয়েড ইঞ্জিনিয়ার বেশিরভাগ অংশের জন্য এই সমস্যাটি সমাধান করেছেন। এক্সএমএলে যে বৈশিষ্ট্যগুলি উপেক্ষা করা হয়েছিল সেগুলি এখন ব্যতীত repeatCountএবং fillEnabledযা এখনও অবহেলা করা হয়েছে (কোনও কারণে উদ্দেশ্য নিয়ে) কাজ করে। এর অর্থ AnimationSetদুর্ভাগ্যক্রমে পুনরাবৃত্তি করা এখনও সহজ নয় ।

বিশদগুলির জন্য দয়া করে আপডেট করা ডক্সে ওভারভিউটি দেখুন (কোন বৈশিষ্ট্যগুলি উপেক্ষা করা হয়, কোনটি কাজ করে এবং কোনটি শিশুদের মধ্যে দেওয়া হয় তা ব্যাখ্যা করে)। এবং প্রকৃতপক্ষে কী fillAfter, fillBeforeএবং fillEnabledপ্রকৃতপক্ষে কী করা হয় তার গভীর বোঝার জন্য এখানে এ সম্পর্কে প্রকৌশলের (চিত হাসেস) ব্লগ পোস্টটি দেখুন ।


আসল উত্তর

পাভেল এবং অন্যদের দ্বারা উত্তরগুলি প্রসারিত করার জন্য: এটি সত্য যে <set>ট্যাগটি হাস্যকরভাবে বগি। এটি repeatCountএবং অন্যান্য বেশ কয়েকটি বৈশিষ্ট্যের সাথে সঠিকভাবে ডিল করতে পারে না ।

এটি কী কী ডিল করতে পারে এবং কী তা করতে পারে না তা ভেবে কয়েক ঘন্টা ব্যয় করেছি এবং এখানে একটি বাগ রিপোর্ট / ইস্যু জমা দিয়েছি : ইস্যু 17662

সংক্ষেপে (এটি উদ্বেগজনক AnimationSet):

সেটরেপিটকাউন্ট () / অ্যান্ড্রয়েড: রিপিটকাউন্ট

এই বৈশিষ্ট্যটি (পাশাপাশি রিপিটমোড) কোড বা এক্সএমএলে কাজ করে না। এটি অ্যানিমেশনগুলির পুরো সেটটিকে পুনরাবৃত্তি করা শক্ত করে তোলে।

সেটডিউরেশন () / অ্যান্ড্রয়েড: সময়কাল

কোডটি ওয়ার্কস-এ একটি অ্যানিমেশনসেটে সেট করা (শিশুদের অ্যানিমেশনগুলির সমস্ত মেয়াদকে ওভাররাইড করে), তবে এক্সএমএল-এ ট্যাগ অন্তর্ভুক্ত করার পরে নয়

সেটফিলএফটার () / অ্যান্ড্রয়েড: ফিলফএফটার

এটি ট্যাগের জন্য কোড এবং এক্সএমএল উভয় ক্ষেত্রেই কাজ করে। আশ্চর্যরকমভাবে আমি এটি পূরণের সত্যটি সেট করার প্রয়োজন ছাড়াই কাজ করতেও পেরেছি।

সেটফিলবায়োফার () / অ্যান্ড্রয়েড: ভিজিটোফরফোর

কোড এবং এক্সএমএল উভয় ক্ষেত্রেই কোনও প্রভাব / উপেক্ষা নেই বলে মনে হচ্ছে

সেটফিলইনেবল () / অ্যান্ড্রয়েড: ফিলইনএবলড

কোড এবং এক্সএমএল উভয় ক্ষেত্রেই কোনও প্রভাব / উপেক্ষা নেই বলে মনে হচ্ছে। আমি এখনও ফিলিএনবেলড অথবা ভরাটএইনবেলকে ভুয়াতে সেট না করেও কাজ করতে ফিলফএফটার পেতে পারি।

সেটস্টার্টঅফসেট () / অ্যান্ড্রয়েড: স্টার্টঅফসেট

এটি কেবল কোডে কাজ করে এক্সএমএল নয়।


48

আমি খুঁজে পেয়েছি < অ্যাসেট > ট্যাগটি অ্যানিমেশনসেটে বগি বাস্তবায়ন করেছে ।
এটি পুনরাবৃত্তিহীন সাথে সঠিকভাবে ডিল করতে পারে না ।
আমরা কি করতে পারেন - সেট হয় repeatCount সরাসরি <স্কেল> ট্যাগ।

এই এক্সএমএল উত্সটি ভালভাবে কাজ করছে:

<?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
এসডিকে

এক্সএমএলে রিপিটকাউন্ট ঘোষণা করে, তবে কোডে নয়
onmyway133

39

আপনার বৈশিষ্ট্যটি অন্তর্ভুক্ত করা উচিত

android:repeatCount="infinite"

তবে আপনার "স্কেল" অ্যানিমেশনটিতে "সেট" নেই


4
কিন্তু এই অ্যানিমেশনগুলি কি পূর্ববর্তীটি সম্পন্ন হওয়ার জন্য অপেক্ষা করবে? ধন্যবাদ
ফিলিটি_উইজার্ড

ধন্যবাদ, এই কাজ! প্রোগ্রামগতভাবে সেট করা কোনও কারণেই হয়নি।
চেরি-ওয়েভ

ধন্যবাদ! এটি কাজ করে। তবে এটি ধারাবাহিক। প্রতি 5 সেকেন্ডে এটি বলা সম্ভব?
d34th4ck3r

32

পুনরাবৃত্তি অ্যানিমেশন পাওয়ার জন্য আমি অ্যানিমেশন শ্রোতাকে কাজে লাগিয়েছি এবং এনিমেশনটি শেষ হয়ে গেলে আবার ফোন করে। এটি বন্ধনী সহ অ্যানিমেশনের মতো দৃষ্টি নিবদ্ধ করে একটি ক্যামেরা রেটিকুল করে।

এখানে অ্যানিমেশন লেআউটটি এক্সএমএল

<?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);
}

4
হ্যাঁ এটি সঠিক উত্তর হওয়া উচিত। সমস্ত ডিভাইস এবং ওএস স্তরে কাজ করা
স্মিত

এটি আমাকেও সহায়তা করেছে তবে আমি এন্ডিমেশন এনিমেশন এনিমেশন = এনিমেশন ইউটিলেস.লোডএনিমেশন (BuzzFinderActivity.this, R.anim.crosshair_focusing) থেকে এই দুটি লাইন সরিয়েছি; anim.setAnimationListener (এটি);
এইডা

10

আমিও একই সমস্যার মুখোমুখি হয়েছি .. আমি অ্যান্ড্রয়েডকে অন্তর্ভুক্ত করেছি: এক্সএমএল ফাইলে রিপিটকাউন্ট = "অসীম" ... এটির কাজটি ঠিকঠাক ...

  <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
repeatModeহয় RESTARTঅথবাREVERSE
xintink

আমি যা চাই ঠিক তা-ই চালায়, গতিশীলভাবে অনন্তকে সেট করুন।
বরুণ চৌধুরী চৌধুরী


4

আমি ড্যানিয়েলের কোডটি অ্যানিমেশনটির সঠিক সংখ্যার বারটি দেখানোর জন্য ব্যবহার করার চেষ্টা করেছি এবং একটি সমস্যা হয়েছিল: অ্যানিমেশনটি প্রায় N / 2 বার প্রদর্শিত হয়েছিল, যখন এন টাইম প্রত্যাশিত।

সুতরাং আমি ড্যানিয়েলের কোডটি সংশোধন করেছি:

//...
@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 বার স্পষ্টভাবে দেখানো হয়েছে, কারণ ভিউ.পস্ট () পদ্ধতিটি পূর্ববর্তী অ্যানিমেশনের সাথে সম্পর্কিত সমস্ত ক্রিয়া শেষ করে নতুন অ্যানিমেশন শুরু করার ক্ষমতা দেয়।


3

আপনার এক্সএমএল কোডে আপনাকে কেবল একটি লাইন যুক্ত করতে হবে যা আমি নীচে প্রস্তাব করেছি।

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

3

আমি 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" />

2

অ্যান্ড্রয়েড এসডিকে সংস্করণ ৪.০.৩ সহ:

প্রদত্ত অ্যানিমেশন উপাদানগুলিতে:

অ্যান্ড্রয়েড: পুনরুক্তি = "- 1"

এটিকে একটি অসীম অ্যানিমেশন করে তোলে।


ধন্যবাদ! এটি কোনও
কার্যতালিকা

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();

এন এর পুনরাবৃত্তি সংখ্যা।


1

আমি আমার বেশিরভাগ জিনিস প্রোগ্রামগতভাবে করি এবং আমি এটির চেয়ে দেরী বা অদক্ষ হতে পারি তবে আমি পুনরাবৃত্ত অ্যানিমেশন সেটটি সম্পন্ন করে (আমার কাছে এমনকি দুটি বিকল্প অ্যানিমেশন সেট রয়েছে)। এই সমস্ত কোডটি কেবল একটি চিত্রের মধ্যে বিবর্ণ, বিরতি দেওয়া, তারপরে বিবর্ণ হওয়া, অন্য ছবিতে বিবর্ণ হওয়া, বিরতি দেওয়া, বিবর্ণ হয়ে যাওয়া এবং প্রথমটিটি ফিরিয়ে আনা (ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন)। আমি আমার চিত্রদর্শনগুলি প্রথম সংজ্ঞায়িত করেছি:

    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

আমি এটি যেতে পেরেছি ... আমি ক্রমাগত একটি বৃত্তে ঘোরার জন্য একটি ভিউ পাওয়ার চেষ্টা করছিলাম।

পূর্ববর্তী আমি রোটেশন.সেটেরিপিটমোড (-1) ব্যবহার করছিলাম তবে এটি কার্যকর হয়নি। setrepeatcount এ স্যুইচ করা হয়েছে এবং এটি কাজ করে। এটি জেলি শিম 4.2.2 এ রয়েছে

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

0

আমি একই সমস্যার মুখোমুখি হয়েছি, তবে ইউআই থ্রেডটি মাঝে মাঝে খুব ব্যস্ত থাকতে পারে বলে জাভাতে কোনও সময়সীমার কাজ করতে চাইনি। ইনফিনাইট পতাকা সেট ট্যাগের জন্য কাজ করে না। সুতরাং আমি কোডটির একটি সামান্য অংশ দিয়ে সমস্যাটি সমাধান করেছি:

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);
    }
});

নিম্নলিখিত এক্সএমএল সহ:

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

যেখানে মিকোনটি আমার লেআউট থেকে একটি চিত্রদর্শন।


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

আপনি গবেষণা করতে চান এমন অনেকগুলি ক্লাস রয়েছে তবে বর্তমানে আমি অবজেক্ট অ্যানিমেটার ব্যবহার করছি যা অত্যন্ত নমনীয়। আমি অ্যানিমেশন বা অ্যানিমেশন ব্যবহার করতে সুপারিশ করব না:

  • অ্যানিমেশন
  • অ্যানিমেশন ইউটিস
  • অ্যানিম্যাটর
  • অ্যানিম্যাটরআইনফ্লেটার
  • অ্যানিম্যাটরলিস্টনার
  • অ্যানিম্যাটরলিস্টনারএডাপ্টার

0

প্রথমে অ্যানিমেশনটি শেষ করার জন্য প্রথমে শুনতে হবে তারপরে অনসটপ অ্যানিমেশন কলটিতে অ্যানিমেশনটি পুনরায় শুরু করতে হবে, এই লিঙ্কটিতে চেষ্টা করুন


0

রিসোর্সগুলি আবার লোড হওয়া থেকে বাঁচাতে @ দানুফরের উত্তরটিতে সামান্য টুইট করুন।

    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

উপরের সমাধানগুলির কোনওটিই আমার ক্ষেত্রে কার্যকর হয়নি। ডানুফারের সমাধান অ্যানিমেশন সেটটির জন্য কাজ করেছিল তবে যখন আমি ইউনিট পরীক্ষা করছিলাম তখন আমার পরীক্ষাগুলি এই অসীম লুপে আটকে যেত। অবশেষে, আমার ক্ষেত্রে নির্দিষ্ট, আমার এই অ্যানিমেশনটি নির্দিষ্ট সময়টির পুনরাবৃত্তি করতে হবে। সুতরাং, আমি অ্যানিমে_আরট.এক্সএমএলটিতে ম্যানুয়ালি আমার অ্যানিমেশনটির অনুলিপিগুলিকে অফসেটের মান যুক্ত করেছি । আমি জানি এটি খারাপ এবং অনেকের পক্ষে কাজ করবে না তবে এটি ছিল আমার মামলার একমাত্র কাজ।

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

একটি লুপিং থ্রেডে কোডটি যুক্ত করার চেষ্টা করুন বা কিছুক্ষণ / বিবৃতি দেওয়ার জন্য


ঠিক আছে, আমি খুঁজে পেয়েছি একমাত্র সমাধান সেট ট্যাগ ব্যবহার করা এড়ানো avoid
পাভেল চেরনভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.