ภาพเคลื่อนไหวของ 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>

ก่อนอื่นควรปรับขนาดภาพจาก 1.0 ถึง 1.2 ขนาดใน 500 มิลลิวินาที
จากนั้นปรับขนาดกลับเป็น 1.0 ใน 500 มิลลิวินาที
นี่คือวิธีที่ฉันใช้:

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

มันทำให้รอบเดียวแล้วเสร็จ
มันสเกลขึ้นแล้วลดขนาด ans แล้วหยุด

ฉันจะทำงานนี้ให้สำเร็จตามที่ตั้งใจไว้ได้อย่างไร?


imgView ในโค้ดจาวาของคุณคืออะไร?
clifgray

คำตอบ:


63

อัปเดต:ย้อนกลับไปในเดือนกันยายน 2554 วิศวกร Android ได้แก้ไขปัญหานี้เป็นส่วนใหญ่ ขณะนี้แอตทริบิวต์ที่ถูกละเว้นใน XML ใช้งานได้ยกเว้นrepeatCountและfillEnabledยังคงถูกละเว้น (โดยมีวัตถุประสงค์เพื่อเหตุผลบางประการ) ซึ่งหมายความว่ายังคงไม่ใช่เรื่องง่ายที่จะทำซ้ำอย่างAnimationSetน่าเสียดาย

สำหรับรายละเอียดโปรดดูภาพรวมในเอกสารที่อัปเดต (อธิบายว่าแอตทริบิวต์ใดถูกละเว้นงานใดและส่งต่อไปยังเด็ก) และเพื่อความเข้าใจที่ลึกซึ้งของสิ่งfillAfter, fillBeforeและfillEnabledทำจริงให้ดู (เชษฐ์ฮา) โพสต์บล็อกของวิศวกรเกี่ยวกับเรื่องนี้ที่นี่


คำตอบเดิม

หากต้องการขยายคำตอบของ Pavel และคนอื่น ๆ : เป็นความจริงที่ว่า<set>แท็กนั้นมีปัญหา ไม่สามารถจัดการกับrepeatCountคุณลักษณะอื่น ๆได้อย่างถูกต้อง

ฉันใช้เวลาสองสามชั่วโมงในการหาสิ่งที่สามารถทำได้และไม่สามารถจัดการได้และได้ส่งรายงานข้อบกพร่อง / ปัญหาที่นี่: ฉบับที่ 17662

โดยสรุป (สิ่งนี้เกี่ยวข้องAnimationSet):

setRepeatCount () / android: repeatCount

แอตทริบิวต์นี้ (เช่นเดียวกับ repeatMode) ไม่ทำงานในโค้ดหรือ XML ทำให้การทำซ้ำทั้งชุดของภาพเคลื่อนไหวทำได้ยาก

setDuration () / android: ระยะเวลา

การตั้งค่านี้บน AnimationSet ในโค้ด WORKS (แทนที่ระยะเวลาทั้งหมดของแอนิเมชั่นเด็ก) แต่ไม่รวมอยู่ในแท็กใน XML

setFillAfter () / android: fillAfter

ซึ่งใช้ได้ทั้งในโค้ดและ XML สำหรับแท็ก น่าแปลกที่ฉันทำให้มันทำงานได้โดยไม่จำเป็นต้องตั้งค่า fillEnabled เป็น true

setFillBefore () / android: fillBefore

ดูเหมือนว่าจะไม่มีผล / ละเว้นทั้งในโค้ดและ XML

setFillEnabled () / android: fillEnabled

ดูเหมือนว่าจะไม่มีผล / ละเว้นทั้งในโค้ดและ XML ฉันยังสามารถรับ fillAfter เพื่อทำงานได้แม้ว่าจะไม่รวม fillEnabled หรือการตั้งค่า fillEnabled เป็น false

setStartOffset () / android: startOffset

ใช้งานได้เฉพาะในโค้ดไม่ใช่ XML


48

ฉันพบว่า<ชุด>แท็กการดำเนินงานมีรถในชั้นเรียนAnimationSet
มันไม่สามารถจัดการอย่างถูกต้องกับrepeatCount
สิ่งที่เราทำได้ - คือการตั้งค่าrepeatCountโดยตรงในแท็ก<scale>

ทรัพยากร 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_

การประกาศ repeatCount ใน xml ใช้งานได้ แต่ไม่อยู่ในรหัส
onmyway133

39

คุณควรรวมแอตทริบิวต์

android:repeatCount="infinite"

แต่ในภาพเคลื่อนไหว "มาตราส่วน" ของคุณไม่ได้อยู่ใน "ชุด"


1
แต่แอนิเมชั่นเหล่านี้จะรอให้การดำเนินการก่อนหน้านี้เสร็จสมบูรณ์หรือไม่ ขอบคุณ
filthy_wizard

ขอบคุณมันได้ผล! การตั้งค่าโดยใช้โปรแกรมไม่ได้ด้วยเหตุผลใดก็ตาม
cherry-wave

ขอบคุณ! สิ่งนี้ได้ผล แต่มันต่อเนื่อง เป็นไปได้ไหมที่จะทำให้สิ่งนี้เกิดขึ้นโดยพูดทุกๆ 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>

นี่คือรหัส java

 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

มันช่วยฉันด้วย แต่ฉันลบสองบรรทัดนี้ออกจาก End method Animation anim = AnimationUtils.loadAnimation (BuzzFinderActivity.this, R.anim.crosshair_focusing); anim.setAnimationListener (นี้);
aida

10

ฉันก็ประสบปัญหาเดียวกัน .. ฉันรวม android: repeatCount = "infinite" ไว้ในไฟล์ XMl .. ตอนนี้มันทำงานได้ดี ...

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

นั่นคือสิ่งที่ฉันต้องการตั้งค่าเป็นอินฟินิตี้แบบไดนามิก
Varun Chaudhary

2
setRepeat ไม่ทำงานตามcode.google.com/p/android/issues/detail?id=17662
ElliotM

4

ฉันพยายามใช้รหัสของ Daniel เพื่อแสดงจำนวนครั้งที่แน่นอนของแอนิเมชั่นและมีปัญหา: ภาพเคลื่อนไหวแสดงประมาณ n / 2 ครั้งเมื่อต้องการ n ครั้ง

ดังนั้นฉันจึงแก้ไขรหัสของ Daniel:

//...
@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>

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

ด้วย android sdk เวอร์ชัน 4.0.3:

ในองค์ประกอบภาพเคลื่อนไหวที่กำหนด:

android: repeatCount = "- 1"

ทำให้เป็นภาพเคลื่อนไหวที่ไม่มีที่สิ้นสุด


ขอบคุณ! มันทำงานได้ดีบน 4.2 โดยไม่มีวิธีแก้ปัญหาใด ๆ
ruX

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

หากคุณต้องการเล่นภาพเคลื่อนไหวซ้ำสำหรับ N-times เท่านั้นให้ทำดังต่อไปนี้:

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

N หมายถึงจำนวนการทำซ้ำ


1

ฉันทำสิ่งต่างๆส่วนใหญ่โดยใช้โปรแกรมและฉันอาจทำงานช้าหรือไม่มีประสิทธิภาพในเรื่องนี้ แต่ก็ทำตามเป้าหมายชุดภาพเคลื่อนไหวซ้ำได้สำเร็จ (ฉันมีชุดภาพเคลื่อนไหวสลับกัน 2 ชุด) รหัสทั้งหมดนี้ทำได้เพียงแค่เลือนในภาพเดียวหยุดชั่วคราวแล้วเลือนหายจางในภาพอื่นหยุดชั่วคราวเลือนและนำภาพแรกกลับมา (ล้างและทำซ้ำ) ฉันกำหนด Imageviews ของฉันก่อน:

    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

ฉันทำได้แล้ว ... ฉันพยายามทำให้มุมมองหมุนเป็นวงกลมอย่างต่อเนื่อง

ก่อนหน้านี้ฉันใช้ rotation.setRepeatMode (-1) แต่ไม่ได้ผล เปลี่ยนเป็น setrepeatcount และใช้งานได้ นี่คือเยลลี่บีน 4.2.2

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

0

ฉันประสบปัญหาเดียวกัน แต่ไม่ต้องการทำเวลาใด ๆ ใน Java เนื่องจากบางครั้งเธรด UI อาจยุ่งมาก ค่าสถานะ 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

ฉันเพิ่งเจอปัญหานี้ในขณะที่ทำงานกับแอพที่เข้ากันได้แบบย้อนกลับ น่าผิดหวังจัง! ฉันลงเอยด้วยการเข้ารหัสคลาสวิธีแก้ปัญหาที่ดีซึ่งสามารถเรียกได้จาก onCreate และจะเริ่มต้นทรัพยากรแอนิเมชั่นใด ๆ ลงในลูปที่ไม่มีกำหนด

คลาส AnimationLooper มีให้ที่นี่: https://gist.github.com/2018678


0

หลังจากค้นคว้าหาคำตอบจากอินเทอร์เน็ตแล้วฉันพบวิธีแก้ปัญหาที่เหมาะกับตัวเอง (และใช่ repeatCount และ repeatMode นั้นมีข้อบกพร่องอย่างมากเมื่อใช้ร่วมกับ animationSet)

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

มีคลาสมากมายที่คุณอยากจะค้นคว้า แต่ตอนนี้ฉันใช้ objectAnimator ซึ่งมีความยืดหยุ่นสูง ฉันไม่แนะนำให้ใช้ Animation หรือ AnimationUtils:

  • ภาพเคลื่อนไหว
  • แอนิเมชัน
  • แอนิเมเตอร์
  • AnimatorInflater
  • AnimatorListener
  • AnimatorListenerAdapter

0

จำเป็นต้องฟังให้เสร็จสิ้นของแอนิเมชั่นแรกจากนั้นเริ่มแอนิเมชั่นใหม่ในการโทรกลับ onStopAnimation ลองไปที่ลิงค์นี้


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

ลองเพิ่มรหัสในเธรดแบบวนซ้ำหรือคำสั่ง while / for


ทางออกเดียวที่ฉันพบคือหลีกเลี่ยงการใช้ set tag
Pavel Chernov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.