[英]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.