Android: 如何 运行 动画结束时的一些代码
Android: How to run some code on animation end
在 android 我正在尝试创建一个倒计时动画,它会做两件事:
- 它将一个正方形从绿色渐变为白色
- 执行后它会更改文本视图的上下文
密码是:
int colorFrom = getResources().getColor(R.color.green);
int colorTo = getResources().getColor(R.color.white);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
colorAnimation.setRepeatMode(ValueAnimator.RESTART);
colorAnimation.setDuration(30000); // milliseconds
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animator)
{
tv.setBackgroundColor((int) animator.getAnimatedValue());
}
});
colorAnimation.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
String authcode = getAuthCode(login_session);
code.setText(authcode);
}
});
colorAnimation.start();
我知道 Detecting when ValueAnimator is done,这是我将解决方案移植到我的代码中的地方,但它似乎不适用于我的情况。绿色到白色的渐变有效,但完成后它只是重新启动动画,而没有在文本视图中设置新文本。
我做错了什么,动画结束时如何设置新文本?
尝试在下面添加 callback
以获得 addListener
colorAnimation.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
String authcode = getAuthCode(login_session);
code.setText(authcode);
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
Try this
使用这个
colorAnimation.setRepeatCount(0);
而不是这个
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
示例代码
int colorFrom = getResources().getColor(R.color.green);
int colorTo = getResources().getColor(R.color.lightWhite);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setRepeatCount(0);
colorAnimation.setRepeatMode(ValueAnimator.RESTART);
colorAnimation.setDuration(3000); // milliseconds
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
tv.setBackgroundColor((int) animator.getAnimatedValue());
}
});
colorAnimation.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
tv.setText("TEST");
}
});
colorAnimation.start();
OR
您也可以使用AnimatorListenerAdapter
This adapter class provides empty implementations of the methods from Animator.AnimatorListene
r. Any custom listener that cares only about a subset of the methods of this listener can simply subclass this adapter class instead of implementing the interface directly.
试试这个
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
int colorFrom = getResources().getColor(R.color.green);
int colorTo = getResources().getColor(R.color.lightWhite);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
//colorAnimation.setRepeatMode(ValueAnimator.RESTART);
colorAnimation.setDuration(3000); // milliseconds
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
tv.setBackgroundColor((int) animator.getAnimatedValue());
}
});
colorAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
tv.setText("END");
}
@Override
public void onAnimationRepeat(Animator animation) {
super.onAnimationRepeat(animation);
tv.setText("REPEAT");
}
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
tv.setText("START");
}
@Override
public void onAnimationPause(Animator animation) {
super.onAnimationPause(animation);
tv.setText("PAUSE");
}
@Override
public void onAnimationResume(Animator animation) {
super.onAnimationResume(animation);
tv.setText("RESUME");
}
});
colorAnimation.start();
}
}
问题出在这行代码
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
它会继续动画因此动画结束的回调永远不会完成。
如果您只是评论该行,您将在 30 秒后(如您在代码中所建议的那样)完成动画结束的回调。
设置RepeatCount = 0
colorAnimation.setRepeatCount(0);
而不是
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
在 android 我正在尝试创建一个倒计时动画,它会做两件事:
- 它将一个正方形从绿色渐变为白色
- 执行后它会更改文本视图的上下文
密码是:
int colorFrom = getResources().getColor(R.color.green);
int colorTo = getResources().getColor(R.color.white);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
colorAnimation.setRepeatMode(ValueAnimator.RESTART);
colorAnimation.setDuration(30000); // milliseconds
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animator)
{
tv.setBackgroundColor((int) animator.getAnimatedValue());
}
});
colorAnimation.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
String authcode = getAuthCode(login_session);
code.setText(authcode);
}
});
colorAnimation.start();
我知道 Detecting when ValueAnimator is done,这是我将解决方案移植到我的代码中的地方,但它似乎不适用于我的情况。绿色到白色的渐变有效,但完成后它只是重新启动动画,而没有在文本视图中设置新文本。
我做错了什么,动画结束时如何设置新文本?
尝试在下面添加 callback
以获得 addListener
colorAnimation.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
String authcode = getAuthCode(login_session);
code.setText(authcode);
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
Try this
使用这个
colorAnimation.setRepeatCount(0);
而不是这个
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
示例代码
int colorFrom = getResources().getColor(R.color.green);
int colorTo = getResources().getColor(R.color.lightWhite);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setRepeatCount(0);
colorAnimation.setRepeatMode(ValueAnimator.RESTART);
colorAnimation.setDuration(3000); // milliseconds
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
tv.setBackgroundColor((int) animator.getAnimatedValue());
}
});
colorAnimation.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
tv.setText("TEST");
}
});
colorAnimation.start();
OR
您也可以使用AnimatorListenerAdapter
This adapter class provides empty implementations of the methods from
Animator.AnimatorListene
r. Any custom listener that cares only about a subset of the methods of this listener can simply subclass this adapter class instead of implementing the interface directly.
试试这个
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
int colorFrom = getResources().getColor(R.color.green);
int colorTo = getResources().getColor(R.color.lightWhite);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
//colorAnimation.setRepeatMode(ValueAnimator.RESTART);
colorAnimation.setDuration(3000); // milliseconds
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
tv.setBackgroundColor((int) animator.getAnimatedValue());
}
});
colorAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
tv.setText("END");
}
@Override
public void onAnimationRepeat(Animator animation) {
super.onAnimationRepeat(animation);
tv.setText("REPEAT");
}
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
tv.setText("START");
}
@Override
public void onAnimationPause(Animator animation) {
super.onAnimationPause(animation);
tv.setText("PAUSE");
}
@Override
public void onAnimationResume(Animator animation) {
super.onAnimationResume(animation);
tv.setText("RESUME");
}
});
colorAnimation.start();
}
}
问题出在这行代码
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
它会继续动画因此动画结束的回调永远不会完成。 如果您只是评论该行,您将在 30 秒后(如您在代码中所建议的那样)完成动画结束的回调。
设置RepeatCount = 0
colorAnimation.setRepeatCount(0);
而不是
colorAnimation.setRepeatCount(ValueAnimator.INFINITE);