Hoạt ảnh Android không lặp lại


85

Tôi đang cố gắng tạo hoạt ảnh đơn giản lặp lại nhiều lần (hoặc vô hạn).
Có vẻ như điều android:repeatCountđó không hoạt động!
Đây là tài nguyên hoạt hình của tôi từ /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>

Đầu tiên, nó sẽ chia tỷ lệ hình ảnh từ 1,0 đến 1,2 kích thước trong 500 ms.
Và sau đó quy mô nó trở lại 1,0 trong 500 ms.
Đây là cách tôi sử dụng nó:

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

Nó thực hiện một chu kỳ và sau đó kết thúc.
Nó tăng lên, sau đó giảm dần ans rồi dừng lại.

Làm thế nào tôi có thể làm cho điều này hoạt động như dự định?


ImgView ở đây trong mã java của bạn là gì?
clifgray vào

Câu trả lời:


63

Cập nhật: Vào tháng 9 năm 2011, một kỹ sư Android đã khắc phục phần lớn sự cố này. Các thuộc tính đã bị bỏ qua trong XML hiện hoạt động, ngoại trừ repeatCountfillEnabledvẫn bị bỏ qua (có chủ đích vì một số lý do). Điều này có nghĩa là không dễ dàng để lặp lại một AnimationSetđiều không may.

Để biết chi tiết, vui lòng xem tổng quan trong tài liệu cập nhật (giải thích thuộc tính nào bị bỏ qua, thuộc tính nào hoạt động và thuộc tính nào được chuyển cho trẻ em). Và đối với một sự hiểu biết sâu sắc hơn về những gì fillAfter, fillBeforefillEnabledthực sự làm, xem (Chet Haase) bài viết trên blog của kỹ sư về nó ở đây .


Câu trả lời gốc

Để mở rộng câu trả lời của Pavel và những người khác: đúng là <set>thẻ bị lỗi một cách kỳ cục. Nó không thể xử lý chính xác repeatCountvà một số thuộc tính khác.

Tôi đã dành vài giờ để tìm ra những gì nó có thể và không thể giải quyết và đã gửi báo cáo lỗi / vấn đề tại đây: Issue 17662

Tóm lại (mối quan tâm này AnimationSet):

setRepeatCount () / android: repeatCount

Thuộc tính này (cũng như repeatMode) không hoạt động trong mã hoặc XML. Điều này làm cho việc lặp lại toàn bộ tập hợp các hoạt ảnh trở nên khó khăn.

setDuration () / android: thời lượng

Đặt điều này trên AnimationSet trong mã WORKS (ghi đè tất cả thời lượng của hoạt ảnh trẻ em), nhưng không được đưa vào thẻ trong XML

setFillAfter () / android: fillAfter

Điều này hoạt động trong cả mã và XML cho thẻ. Thật kỳ lạ, tôi đã làm cho nó hoạt động mà không cần đặt fillEnabled thành true.

setFillBefore () / android: fillBefore

Có vẻ như không có tác dụng / bị bỏ qua trong cả mã và XML

setFillEnabled () / android: fillEnabled

Có vẻ như không có tác dụng / bị bỏ qua trong cả mã và XML. Tôi vẫn có thể làm cho fillAfter hoạt động ngay cả khi không bao gồm fillEnabled hoặc đặt fillEnabled thành false.

setStartOffset () / android: startOffset

Điều này chỉ hoạt động trong mã chứ không phải XML.


48

Tôi thấy rằng thẻ <set> đã triển khai lỗi trong lớp AnimationSet .
Nó không thể xử lý chính xác với repeatCount .
Những gì chúng ta có thể làm - là đặt repeatCount trực tiếp trong thẻ <scale> .

Tài nguyên XML này đang hoạt động tốt:

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

Thật không may, điều này chỉ được giới hạn ở một hoạt ảnh cùng một lúc.
Chúng tôi không thể xác định chuỗi hoạt ảnh theo cách này ...


Tôi đang chạy 2 hoạt ảnh trong một bộ và chúng không cho tôi bất kỳ vấn đề nào. vui lòng cho tôi biết về vấn đề mà bạn đang nói chuyện? lỗi nào? hiện đang làm việc trên 1.6 sdk
AZ_

Tuyên bố repeatCount trong tác phẩm xml, nhưng không phải trong mã
onmyway133

39

Bạn nên bao gồm thuộc tính

android:repeatCount="infinite"

Nhưng trong hoạt ảnh "quy mô" của bạn không có trong "bộ"


1
nhưng liệu những hoạt ảnh này có đợi hoàn thành trước không? cảm ơn
filthy_wizard

Cảm ơn, điều này đã làm việc! Đặt nó theo chương trình không vì bất kỳ lý do gì.
cherry-wave

Cảm ơn! Điều này đã hiệu quả. Nhưng nó liên tục. Có thể làm cho điều này xảy ra cứ sau 5 giây không?
d34th4ck3r

32

Để có hoạt ảnh lặp lại, tôi đã sử dụng trình nghe hoạt ảnh và gọi lại hoạt ảnh khi nó kết thúc. Điều này thực hiện một máy ảnh quy tắc lấy nét giống như hoạt ảnh với dấu ngoặc.

Đây là bố cục hình ảnh động 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>

Đây là mã 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
Ya nó phải là câu trả lời chính xác. Làm việc ở tất cả thiết bị và cấp hệ điều hành
Smeet

nó cũng giúp tôi nhưng tôi đã xóa hai dòng này khỏi phương thức End Animation anim = AnimationUtils.loadAnimation (BuzzFinderActivity.this, R.anim.crosshair_focusing); anim.setAnimationListener (this);
aida

10

Tôi cũng gặp phải vấn đề tương tự .. tôi đã bao gồm android: repeatCount = "finity "trong tệp XMl..nên nó hoạt động tốt ...

  <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

bạn có thể thử mã này. Trong mã của bạn chỉ cần thêm,

firstAnimation.setRepeatCount(5);

Thao tác này sẽ lặp lại hoạt ảnh trong một thời gian nhất định

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

Điều này sẽ lặp lại hoạt ảnh vô thời hạn.


4
repeatModenên là một trong hai RESTARThoặcREVERSE
xinthink.

đó chính xác là những gì tôi muốn, được đặt thành đặt động thành vô cùng.
Varun Chaudhary

2

4

Tôi đã cố gắng sử dụng mã của Daniel để hiển thị số lần chính xác hoạt ảnh và gặp sự cố: hoạt ảnh được hiển thị gần đúng n / 2 lần, trong khi dự kiến ​​là n lần.

Vì vậy, tôi đã sửa đổi mã của 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);
            }
        }  
    } 
}
//... 

Sử dụng biến thể, được hiển thị ở trên, hoạt ảnh được hiển thị chính xác REPEAT_COUNT lần, vì phương thức View.post () cung cấp khả năng bắt đầu hoạt ảnh mới sau khi kết thúc tất cả các hành động, liên quan đến hoạt ảnh trước đó.


3

bạn chỉ cần thêm một dòng vào mã xml mà tôi đã đề xuất bên dưới.

<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

Với phiên bản sdk android 4.0.3:

Trong các phần tử hoạt hình đã cho:

android: repeatCount = "- 1"

làm cho nó trở thành một hình ảnh động vô hạn.


Cảm ơn! Đó là công việc tốt trên 4.2 mà không cần bất kỳ workaround
ruX

2

Thêm lớp sau vào dự án của bạn:

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

Để có vòng lặp vô hạn của chế độ xem của bạn, hãy làm như sau:

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

Nếu bạn chỉ muốn lặp lại hoạt ảnh cho N lần, hãy làm như sau:

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

N là viết tắt của số lần lặp lại.


2

Tôi đã giải quyết vấn đề này bằng cách sử dụng android:repeatMode="reverse"trước đây trong dự án của mình.

<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

Tôi thực hiện hầu hết nội dung của mình theo lập trình và tôi có thể đến muộn hoặc không hiệu quả đối với công việc này nhưng điều này nhưng tôi đã hoàn thành mục tiêu về bộ hoạt ảnh lặp lại (tôi thậm chí có 2 bộ hoạt ảnh xen kẽ). Tất cả những gì mã này làm chỉ đơn giản là làm mờ dần trong một hình ảnh, tạm dừng, sau đó mờ dần, mờ dần trong hình ảnh khác, tạm dừng, mờ dần và đưa trở lại hình ảnh đầu tiên (rửa sạch và lặp lại). Lần đầu tiên tôi xác định Imageviews của mình:

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

Sau đó, tôi tạo hai bộ hẹn giờ, bộ hẹn giờ tác vụ và bộ xử lý để giải quyết khi nào bắt đầu và dừng mỗi hoạt ảnh:

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

Cuối cùng, thay vì tạo bộ hoạt ảnh bằng cách thêm hoạt ảnh, tôi chỉ trình nghe hoạt ảnh để xác định thời điểm bắt đầu mỗi hoạt ảnh:

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

        }
    });
}    

Sự thống nhất và vô hiệu nơi chỉ những nỗ lực trước đó và làm cho điều này hoạt động đúng. Tôi không biết liệu chúng có được yêu cầu hay không.

Hy vọng điều này sẽ giúp ai đó.


Ryan


1

tôi phải làm cái này ... tôi đang cố gắng để một chế độ xem xoay liên tục trong một vòng tròn.

trước đó tôi đã sử dụng Rotation.setRepeatMode (-1) nhưng điều đó không hoạt động. đã chuyển sang setrepeatcount và nó hoạt động. Đây là trên thạch đậu 4.2.2

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

0

Tôi đã đối mặt với vấn đề tương tự, nhưng không muốn thực hiện bất kỳ điều gì về thời gian trong Java vì điểm đôi khi chuỗi giao diện người dùng có thể rất bận. Cờ INFINITE không hoạt động đối với thẻ đã đặt. Vì vậy, tôi đã giải quyết vấn đề bằng một đoạn mã nhỏ:

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

với XML sau:

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

Trong đó mIcon là một ImageView từ bố cục của tôi.


0

Tôi đã giải quyết vấn đề này. Đây là phiên bản sửa lỗi của tôi:

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

tôi vừa gặp sự cố này khi làm việc trên một ứng dụng tương thích ngược. rất bực bội! Tôi đã mã hóa một lớp cách giải quyết tốt đẹp có thể được gọi từ onCreate và sẽ khởi động bất kỳ tài nguyên hoạt ảnh nào vào một vòng lặp không xác định.

lớp, AnimationLooper, có sẵn tại đây: https://gist.github.com/2018678


0

Sau khi nghiên cứu thông qua các câu trả lời từ internet, tôi đã tìm thấy một giải pháp phù hợp với tôi. (Và vâng, repeatCount và repeatMode rất hay gặp lỗi khi được sử dụng cùng với 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>

Trong hoạt động: (Giải quyết bằng cách đưa ra một khoảng thời gian trễ nhỏ sau khi hoạt ảnh kết thúc).

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

Có rất nhiều lớp bạn muốn nghiên cứu, nhưng hiện tại tôi đang sử dụng objectAnimator có tính linh hoạt cao. Tôi không khuyên bạn nên sử dụng Animation hoặc AnimationUtils:

  • Hoạt hình
  • AnimationUtils
  • Animator
  • AnimatorInflater
  • AnimatorListener
  • AnimatorListenerAdapter

0

Một người cần lắng nghe để hoàn thành hoạt ảnh đầu tiên, sau đó bắt đầu lại hoạt ảnh trong cuộc gọi lại onStopAnimation, hãy thử liên kết này


0

Chỉnh sửa nhỏ đối với câu trả lời @Danufr để tiết kiệm tài nguyên khi tải lại.

    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

Tôi đã giải quyết vấn đề này bằng cách sử dụng chủ đề.

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

nó hoạt động tốt

 GifDrawable gifDrawable = (GifDrawable) gifImageView.getDrawable();
    gifDrawable.setLoopCount(0);

0

Không có giải pháp nào ở trên hoạt động trong trường hợp của tôi. Giải pháp của Danuofr đã hoạt động đối với bộ hoạt ảnh nhưng khi tôi thực hiện kiểm thử đơn vị, các bài kiểm tra của tôi đã từng bị mắc kẹt trong vòng lặp vô hạn này. Cuối cùng, đối với trường hợp của tôi, tôi cần lặp lại hoạt ảnh này số lần cụ thể. Vì vậy, tôi đã thêm thủ công các bản sao hoạt ảnh của mình trong anim_rot.xml theo cách xếp tầng thêm giá trị bù đắp . Tôi biết nó không tốt và sẽ không hiệu quả với nhiều người nhưng đó là cách giải quyết duy nhất cho trường hợp của tôi.

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>

Tôi đã làm điều này để lặp lại hoạt ảnh 3 lần. Bạn có thể thêm nhiều bản sao để lặp lại nó vào thời gian cụ thể bằng cách thêm các giá trị bù đắp.


-1

Cố gắng thêm mã vào chuỗi lặp hoặc câu lệnh while / for


Chà, giải pháp duy nhất tôi đã tìm thấy là tránh sử dụng thẻ đặt.
Pavel Chernov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.