繁体   English   中英

如何在 java 中重复 AnimationSet?

[英]How can I repeat an AnimationSet in java?

我基本上是想让文本振动; 我创建了一些动画并将它们放在 AnimationSet 中,但无法让它重复。 我在这里浏览了一堆解决方案,但还没有为我工作。 谁能告诉我我做错了什么或提出更好的方法? 我的代码如下:

package com.example.dealbreaker;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.AnimatorListenerAdapter;
import android.os.Bundle;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.TextView;

import java.util.Random;

public class LobbyOwner extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lobby_owner);
        ShakeIt();
    }

    private void ShakeIt() {
        final int animationTime = 1000;
        final int fromXDelta = 0;
        final int fromYDelta = 0;
        AnimationSet textAnimSet = new AnimationSet(true);
        for (int i = 0; i < 10; ++i) {
            final float randomX = (float) Math.random();
            final float randomY = (float) Math.random();
            float toXDelta = (randomX < 0.5) ? randomX * 10: -randomX * 10;
            float toYDelta = (randomY < 0.5) ? randomY * 10: -randomY * 10;
            TranslateAnimation animation = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
            TranslateAnimation antiAnimation = new TranslateAnimation(fromXDelta, -toXDelta, fromYDelta, -toYDelta);
            animation.setStartOffset(i * animationTime);
            textAnimSet.addAnimation(animation);
            textAnimSet.addAnimation(antiAnimation);
        }
        Log.i("AnimationSet", textAnimSet.getAnimations().toString()); //shows 10 animations in the animationset
        textAnimSet.setDuration(animationTime);
        textAnimSet.setAnimationListener(new Animation.AnimationListener(){
            @Override
            public void onAnimationStart(Animation animation) {
                //do I need something here?
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //textAnimSet.start(); //doesn't work?!
                //tv.startAnimation(textAnimSet); //doesn't work
                //Log.i("Information", "We are here"); //generates 3 outputs???
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

        TextView tv = (TextView) findViewById(R.id.excitedLobbyTxtView);
        tv.clearAnimation();
        tv.startAnimation(textAnimSet);
    }

}

我想通了为什么我不能重新启动 animation,我已经在我的 AnimationListener 下声明了我的视图电视,因此我无法访问该变量......我仍然对为什么 animation 不会返回相同的方向感到困惑,即使反动画变量虽然。 工作代码如下:

package com.example.dealbreaker;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.AnimatorListenerAdapter;
import android.os.Bundle;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.TextView;

import java.util.Random;

public class LobbyOwner extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lobby_owner);
        ShakeIt();
    }

    private void ShakeIt() {
        final int animationTime = 20;
        final int fromXDelta = 0;
        final int fromYDelta = 0;
        AnimationSet textAnimSet = new AnimationSet(true);
        for (int i = 0; i < 10; ++i) {
            final float randomX = (float) Math.random();
            final float randomY = (float) Math.random();
            float toXDelta = (randomX < 0.5) ? randomX * 10: -randomX * 10;
            float toYDelta = (randomY < 0.5) ? randomY * 10: -randomY * 10;
            TranslateAnimation animation = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
            TranslateAnimation antiAnimation = new TranslateAnimation(-toXDelta, fromXDelta, -toYDelta, fromYDelta);
            animation.setStartOffset(i * animationTime);
            textAnimSet.addAnimation(animation);
            textAnimSet.addAnimation(antiAnimation);
        }
        textAnimSet.setDuration(animationTime);
        TextView tv = (TextView) findViewById(R.id.excitedLobbyTxtView);
        tv.clearAnimation();
        textAnimSet.setAnimationListener(new Animation.AnimationListener(){
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                tv.startAnimation(textAnimSet);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        tv.startAnimation(textAnimSet);
    }

}

请尝试在完成后重置您的 animation for i textAnimSet.reset(); 完整代码:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ShakeIt();
    }


    private void ShakeIt() {
        TextView tv = (TextView) findViewById(R.id.excitedLobbyTxtView);
        tv.clearAnimation();


        final int animationTime = 1000;
        final int fromXDelta = 0;
        final int fromYDelta = 0;
        AnimationSet textAnimSet = new AnimationSet(true);
        for (int i = 0; i < 10; ++i) {
            final float randomX = (float) Math.random();
            final float randomY = (float) Math.random();
            float toXDelta = (randomX < 0.5) ? randomX * 10: -randomX * 10;
            float toYDelta = (randomY < 0.5) ? randomY * 10: -randomY * 10;
            TranslateAnimation animation = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
            TranslateAnimation antiAnimation = new TranslateAnimation(fromXDelta, -toXDelta, fromYDelta, -toYDelta);
            animation.setStartOffset(i * animationTime);
            textAnimSet.addAnimation(animation);
            textAnimSet.addAnimation(antiAnimation);
        }
        Log.i("AnimationSet", textAnimSet.getAnimations().toString()); //shows 10 animations in the animationset
        textAnimSet.setDuration(animationTime);
        textAnimSet.setAnimationListener(new Animation.AnimationListener(){
            @Override
            public void onAnimationStart(Animation animation) {
                //do I need something here?
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                textAnimSet.reset();
                textAnimSet.startNow();
                //textAnimSet.start(); //doesn't work?!
                //tv.startAnimation(textAnimSet); //doesn't work
                //Log.i("Information", "We are here"); //generates 3 outputs???
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });


      tv.startAnimation(textAnimSet);

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM