我四处寻找帮助,但找不到任何答案。目前,当我想在表面视图中为球设置动画时,我调用了一个方法:
将surfaceview中的动画变量设置为扩展AnimationModule(扩展AnimationSet)的自定义类,该类在每次绘制时更改球的属性
然后在每次绘制时调用它,直到 AnimationModule 达到其 maxCount,此时它调用其继承的 AnimationListener.onAnimationEnd
surfaceview 接收到这个回调,然后将动画变量声明为 null,这样它就不会再在每次绘制时调用它了
目前这工作还不错,但感觉非常糟糕和笨拙 - 我真的很想使用其他人使用的久经考验的方法,因为我对动画非常陌生。
另一个问题是我必须使用扩展 view.animation 的动画,所以 ScaleAnimation、TranslateAnimation 等。这对于在屏幕上移动球来说很好,但是当我遇到更复杂的事情时,比如用它的透视动画canvas.polyToPoly 我必须为这种情况创建一个扩展 view.animation 的新类,或者不使用它。
动画模块类:
public abstract class AnimationModule extends AnimationSet{
protected AnimationListener listener;
protected CreatureView attacker;
protected CreatureView defender;
protected BattleCanvas canvas;
protected long increment=0;
protected long individualIncrement=0;
protected float interpolation=0;
private boolean finished=false;
private ArrayList<Animation> animations = new ArrayList<Animation>();
private int currentAnimation=0;
private long totalTime=0;
public interface OnAnimationFinishedListener{
public void OnAnimationFinished();
}
public AnimationModule(boolean shareInterpolator){
super(shareInterpolator);
init();
}
public void setCanvas(BattleCanvas canvas){
this.canvas=canvas;
}
public void setCreatures(CreatureView attacker, CreatureView defender){
this.attacker=attacker;
this.defender=defender;
Log.i("anim","attacker :"+String.valueOf(attacker.getCreature().getBaseName()));
}
public AnimationModule(boolean shareInterpolator, AnimationController controller){
super(shareInterpolator);
}
private void init(){
setFillAfter(true);
}
public boolean isFinished(){
return finished;
}
@Override
public void addAnimation(Animation a){
Log.i("Animation","adding animation");
animations.add(a);
computeDuration();
//super.addAnimation(a);
finished=false;
}
@Override
public void setAnimationListener(AnimationListener a){
super.setAnimationListener(a);
this.listener=a;
}
@Override
public boolean getTransformation(long increment, Transformation transform){
//super.getTransformation(increment, transform);
if(animations.size()>currentAnimation)
animations.get(currentAnimation).getTransformation(individualIncrement, transform);
return true;
}
public void draw(){
}
public void update(){
if(animations.size()>0){
Log.i("Animation",String.valueOf(individualIncrement));
Log.i("Animation",String.valueOf((animations.get(currentAnimation).getRepeatCount()+1)));
Log.i("Animation",String.valueOf(animations.get(currentAnimation).getDuration()));
if(individualIncrement>animations.get(currentAnimation).getDuration()*(animations.get(currentAnimation).getRepeatCount()+1)){
if(animations.size()>currentAnimation+1){
currentAnimation++;
individualIncrement=0;
}else{
finished();
return;
}
}
Log.i("module","on animation "+String.valueOf(currentAnimation));
increment();
if(increment>=getDuration()){
finished();
}
}
}
protected long computeDuration(){
long duration=0;
Iterator<Animation> iterator = animations.iterator();
while (iterator.hasNext()) {
Animation a = iterator.next();
duration=duration+a.computeDurationHint();
}
totalTime=duration;
setDuration(duration);
Log.i("Animation","duration set to "+String.valueOf(duration));
return duration;
}
private void finished(){
finished=true;
if(listener!=null)
listener.onAnimationEnd(this);
}
private void increment(){
increment++;
individualIncrement++;
if(getDuration()!=0){
float far = increment/getDuration();
interpolation=far;
}
else
interpolation=0;
}
}
扩展 AnimationModule 的示例动画:
class BiteAnimation extends AnimationModule{
private float fromSy;
private float fromSx;
private ColorAnimation flash;
public BiteAnimation(boolean shareInterpolator){
super(shareInterpolator);
}
@Override
public void setCanvas(BattleCanvas canvas){
super.setCanvas(canvas);
fromSy=defender.getSy();
fromSx=defender.getSx();
ScaleAnimation scale = new ScaleAnimation(fromSx,fromSx,fromSy,fromSy/2, defender.size/2, defender.size/2);
scale.setDuration(50);
scale.setRepeatMode(2);
scale.setRepeatCount(1);
addAnimation(scale);
flash = new ColorAnimation(defender.getAdd(), Color.WHITE, ColorAnimation.TYPE_ADD, defender);
flash.setDuration(50);
flash.setRepeatMode(2);
flash.setRepeatCount(1);
}
@Override
public void update() {
super.update();
Transformation t = new Transformation();
Log.i("Animation","increment: "+String.valueOf(individualIncrement));
getTransformation(individualIncrement, t);
defender.getMatrix().postConcat(t.getMatrix());
flash.getTransformation(individualIncrement, null);
}
}
如您所见,自定义 animationModule 只是将其转换应用于它正在转换的画布的对象(在本例中为防御者)。然后在表面视图上绘制防御者时使用此画布。
就像我说的,这感觉真的很糟糕,我可以在如何实现对象动画方面提供一些帮助。