如何在java中重复动画集?

如何在java中重复动画集?,java,android,Java,Android,我基本上是想让文本振动;我创建了一些动画,并将它们放在动画集中,但无法重复。我已经看过了很多解决方案,但还没有找到适合我的解决方案。有人能告诉我我做错了什么,或者提出更好的方法吗?我的代码如下: package com.example.dealbreaker; import androidx.appcompat.app.AppCompatActivity; import android.animation.AnimatorListenerAdapter; import android.os.

我基本上是想让文本振动;我创建了一些动画,并将它们放在动画集中,但无法重复。我已经看过了很多解决方案,但还没有找到适合我的解决方案。有人能告诉我我做错了什么,或者提出更好的方法吗?我的代码如下:

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

}
package com.example.dealbreaker;
导入androidx.appcompat.app.appcompat活动;
导入android.animation.AnimatorListenerAdapter;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.animation.animation;
导入android.view.animation.AnimationSet;
导入android.view.animation.AnimationUtils;
导入android.view.animation.LinearInterpolator;
导入android.view.animation.TranslateAnimation;
导入android.widget.TextView;
导入java.util.Random;
公共类LobbyOwner扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u Lobble\u owner);
ShakeIt();
}
私人信息技术(IT){
最终int animationTime=1000;
xdelta的最终整数=0;
fromYDelta的最终整数=0;
AnimationSet text animset=新的AnimationSet(真);
对于(int i=0;i<10;++i){
最终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动画=新的TranslateAnimation(来自XDelta、toXDelta、fromYDelta、toYDelta);
TranslateAnimation antiAnimation=新的TranslateAnimation(来自xDelta,-toXDelta,来自yDelta,-toYDelta);
animation.setStartOffset(i*animationTime);
textAnimSet.addAnimation(动画);
textAnimSet.addAnimation(反动画);
}
Log.i(“AnimationSet”,textAnimSet.getAnimations().toString());//在AnimationSet中显示10个动画
text animset.setDuration(animationTime);
text animset.setAnimationListener(新建Animation.AnimationListener(){
@凌驾
onAnimationStart上的公共无效(动画){
//我需要什么吗?
}
@凌驾
onAnimationEnd上的公共无效(动画){
//textAnimSet.start();//不工作?!
//tv.startAnimation(textAnimSet);//不起作用
//Log.i(“信息”,“我们在这里”);//生成3个输出???
}
@凌驾
onAnimationRepeat上的公共无效(动画){
}
});
TextView tv=(TextView)findViewById(R.id.excitedLobbyTxtView);
tv.clearAnimation();
电视。startAnimation(文本动画集);
}
}

我找到了无法重新启动动画的原因,我在AnimationListener下面声明了我的view tv,因此无法访问变量。。。我仍然不明白为什么即使使用反动画变量,动画也不会返回相同的方向。 工作守则如下:

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

}
package com.example.dealbreaker;
导入androidx.appcompat.app.appcompat活动;
导入android.animation.AnimatorListenerAdapter;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.animation.animation;
导入android.view.animation.AnimationSet;
导入android.view.animation.AnimationUtils;
导入android.view.animation.LinearInterpolator;
导入android.view.animation.TranslateAnimation;
导入android.widget.TextView;
导入java.util.Random;
公共类LobbyOwner扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u Lobble\u owner);
ShakeIt();
}
私人信息技术(IT){
最终int动画时间=20;
xdelta的最终整数=0;
fromYDelta的最终整数=0;
AnimationSet text animset=新的AnimationSet(真);
对于(int i=0;i<10;++i){
最终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动画=新的TranslateAnimation(来自XDelta、toXDelta、fromYDelta、toYDelta);
TranslateAnimation antiAnimation=新的TranslateAnimation(-toXDelta,fromXDelta,-toYDelta,fromYDelta);
animation.setStartOffset(i*animationTime);
textAnimSet.addAnimation(动画);
textAnimSet.addAnimation(反动画);
}
text animset.setDuration(animationTime);
TextView tv=(TextView)findViewById(R.id.excitedLobbyTxtView);
tv.clearAnimation();
text animset.setAnimationListener(新建Animation.AnimationListener(){
@凌驾
onAnimationStart上的公共无效(动画){
}
@凌驾
onAnimationEnd上的公共无效(动画){
电视。startAnimation(文本动画集);
}
@凌驾
onAnimationRepeat上的公共无效(动画){
}
});
电视。startAnimation(文本动画集);
}
}

我找到了无法重新启动动画的原因,我在AnimationListener下面声明了我的view tv,因此无法访问变量。。。我仍然不明白为什么即使使用反动画变量,动画也不会返回相同的方向。 工作守则如下:

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

}
package com.example.dealbreaker;
导入androidx.appcompat.app.appcompat活动;
导入android.animation.AnimatorListenerAdapter;
导入android.os.Bundle;
导入android.util.L