首先我要说的是,我发现的答案是关于XML文件中的可见性被设置为“消失”而不是“不可见”。不幸的是,它对我不起作用。我没有找到解决这个问题的另一个解决方案,因为我是新手,这可能是一个我看不到的非常愚蠢的错误。
这是我调用以启动动画的java方法:
public void animateScoreAddition(int value){
labelAddition.setText("+" + value);
Animation slide = AnimationUtils.loadAnimation(game, R.anim.anim_slide);
slide.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
labelAddition.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation) {
labelAddition.setVisibility(View.INVISIBLE);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
marginTop = (int) ConversionDpPx.convertDpToPixel(10, game);
int marginRight = (int) ConversionDpPx.convertDpToPixel(10, game);
lp.setMargins(0, marginTop, marginRight, 0);
labelAddition.setLayoutParams(lp);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
labelAddition.startAnimation(slide);
}
我为游戏循环创建了一个线程,并在线程中调用runOnUiThread()方法以避免在重绘板时出现异常。这发生在我称为GameController的另一个类中,GameCanvas是处理视图的类:
game.runOnUiThread(new Runnable() {
@Override
public void run() {
game.getGameCanvas().updateScores();
if(previousScore < score){
game.getGameCanvas().animateScoreAddition(score-previousScore);
previousScore = score;
}
if(animationNeeded) {
game.getGameCanvas().invalidate();
soundPool.play(soundMerge, 1, 1, 0, 0, 1);
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
cancelAnimations();
game.getGameCanvas().invalidate();
}
});
这是动画XML文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="600"
android:repeatCount="0"
android:startOffset="0" />
<translate
android:duration="500"
android:fromXDelta="72%p"
android:toXDelta="72%p"
android:fromYDelta="-10"
android:toYDelta="-35"
android:startOffset="0" />
</set>
这是主XML文件中定义的TextView:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+0"
android:id="@+id/labelAddition"
android:textColor="#F67C5F"
android:visibility="invisible"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:layout_toStartOf="@+id/score" />
如您所见,可见性设置为“隐形”而非“消失”。您可能认为问题来自于在侦听器中将视图设置为“可见”,但即使我在调用startAinmation()函数之前执行此操作,它也会给出完全相同的结果。
另外值得一提的是,我使用了一条Log.d(...)消息来确保第一次调用该方法,而且确实足够了。它按照预期进入听众。它只是没有做任何事情。