Android 如何同时平滑地制作多个动画?
我正在开发一款carrom游戏。我试图通过在队列中添加动画,将大约20个图像视图(硬币)组合在一起。。。。。单个视图(硬币)的动画效果很好,但当我全部设置动画时,它会变得非常慢。我希望所有的硬币都能毫无问题地同时动画。这是我写的代码Android 如何同时平滑地制作多个动画?,android,android-animation,Android,Android Animation,我正在开发一款carrom游戏。我试图通过在队列中添加动画,将大约20个图像视图(硬币)组合在一起。。。。。单个视图(硬币)的动画效果很好,但当我全部设置动画时,它会变得非常慢。我希望所有的硬币都能毫无问题地同时动画。这是我写的代码 private void startAnimations(int ID, float[] values) { switch (ID) { case 1: // 43 float values /* *
private void startAnimations(int ID, float[] values) {
switch (ID) {
case 1: // 43 float values
/*
*
* long timeinmill = System.currentTimeMillis();
System.out.println ("\n++++++++ JAVA : ANIMATION METHOD ENDING TIME = "+timeinmill+" +++++++++++\n");
try {
FileWriter fstream = new FileWriter("/sdcard/carromjava.txt");
BufferedWriter out = new BufferedWriter(fstream);
out.write(Long.toString(timeinmill));
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Close the output stream
*/
int counter=0;
int conX=0,conY=1;
boolean go=false;
if(watch==0){
pos=getPositions();
watch=1;
}
long duration = (long) (values[41]*1000); //(values[40] * 1000);
LinearInterpolator linear_interpolator = new LinearInterpolator(); //AccelerateInterpolator();
DecelerateInterpolator linear_interpolator1=new DecelerateInterpolator();
SetAnimation setAnimation = new SetAnimation();
setAnimation.duration = duration;
setAnimation.checkPocketFlag = (int) (values[40]);
setAnimation.produce_sound_type = (int) (values[42]);
// AnimatorSet animatorSet = new AnimatorSet();
// ArrayList<Animator> animationFull=new ArrayList<Animator>();
//System.out.println("Values length ="+values.length);
/* double dx=Math.abs(pos[0]-(values[0]- board_striker/2.0f));
double dy=Math.abs(pos[1]-(values[1]- board_striker/2.0f));
double distance=Math.sqrt((double)(dx*dx)+(dy*dy));
//double velx=dx/values[41];
//double vely=dy/values[41];
double duraX= Math.abs((dx/values[43]))*1000;
double duraY= Math.abs((dy/values[44]))*1000;
double velocity=Math.sqrt((double)(values[43]*values[43])+(values[44]*values[44]));
double dura=distance/velocity;*/
for (int i = -1; i < 19; i++) {
if (i == -1) {
//System.out.println("Coins");
//System.out.println("x="+pos[0]+"Y="+pos[1]);
//System.out.println("Animx="+(values[0]- board_striker/2.0f)+"Animy="+(values[1]- board_striker/2.0f));
ObjectAnimator anim1 = ObjectAnimator.ofFloat(striker,
"translationX",pos[counter], values[counter++] - board_striker/2.0f );
ObjectAnimator anim2 = ObjectAnimator.ofFloat(striker,
"translationY",pos[counter], values[counter++] - board_striker/2.0f );
//Setting Interpolator
anim1.setInterpolator(linear_interpolator);
anim2.setInterpolator(linear_interpolator);
anim1.setDuration((long)values[41]);
anim2.setDuration((long)values[41]);
// if((pos[conX] != (values[conX]-board_striker / 2.0f)) && (pos[conY]!=(values[conY]-board_striker / 2.0f))){
//System.out.println("Animating");
// animationFull.add(anim1);
// animationFull.add(anim2);
AnimatorSet animatorSet = new AnimatorSet();
// animatorSet.play(anim1);
// animatorSet.play(anim2);
animatorSet.playTogether(anim1, anim2);
// animatorSet.setDuration((long)values[41]);
animatorSet.setInterpolator(linear_interpolator);
//animatorSet.start();
setAnimation.anim_queue.add(animatorSet);
setAnimation.last_anim = animatorSet;
// }
conX=+2;
conY=+2;
continue;
//break;
}
ObjectAnimator anim1 = ObjectAnimator.ofFloat(
pieces[i].coinImv, "translationX",
values[counter++] - board_carrommen/2.0f);//2*i+2
ObjectAnimator anim2 = ObjectAnimator.ofFloat(
pieces[i].coinImv, "translationY",
values[counter++] - board_carrommen/2.0f);//2*i+2+1
anim1.setInterpolator(linear_interpolator);
anim2.setInterpolator(linear_interpolator);
anim1.setDuration((long)values[41]);
anim2.setDuration((long)values[41]);
// if((pos[conX] != (values[conX]- board_carrommen / 2.0f)) && (pos[conY]!=(values[conY]- board_carrommen / 2.0f))){
// animationFull.add(anim1);
// animationFull.add(anim2);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(anim1, anim2);
animatorSet.setInterpolator(linear_interpolator);
//animatorSet.setDuration((long)values[41]);
setAnimation.last_anim = animatorSet;
setAnimation.anim_queue.add(animatorSet);
// }
conX+=2;
conY+=2;
}
if(watch!=0){
for(int i=0;i<40;i++){
if(i==0 || i==1)
pos[i]=values[i]- board_striker/2.0f;
else
pos[i]=values[i]-board_carrommen / 2.0f;
}
}
/* animatorSet.playTogether(animationFull);
animatorSet.setDuration((long) (duration));
animatorSet.setInterpolator(linear_interpolator);
setAnimation.last_anim=animatorSet;*/
// Create a job and push to job queu
animation_queue_set.add(setAnimation);
if (read_from_queue) {
start_set_anim();
read_from_queue = false;
}
}
}
anim_listener = new AnimatorListener() {
long start_time ;
public void onAnimationStart(Animator animation) {
start_time = System.currentTimeMillis();
}
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub
}
public void onAnimationEnd(Animator animation) {
// TODO Auto-generated method stub
//long exit = System.currentTimeMillis();
//logger.info("\t Duration = "+animation.getDuration()+ ", Animation Start time = "+start_time +" , +++++++ animation actual end = "+ exit +"\n");
start_set_anim();
}
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub
// onAnimCancel(animation);
}
};
anim_listener_check_pocket = new AnimatorListener() {
public void onAnimationStart(Animator animation) {
// TODO Auto-generated method stub
// onAnimStart(animation);
//System.out.println ("\n +++++++ Animation Start delay = "+animation.getStartDelay());
animation.setStartDelay(0);
}
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub
}
public void onAnimationEnd(Animator animation) {
// TODO Auto-generated method stub
nativeInterface.IonAnimationEnd();
start_set_anim();
}
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub
// onAnimCancel(animation);
}
};
private void start_set_anim() {
if (animation_queue_set.isEmpty()) {
read_from_queue = true;
return;
}
SetAnimation recent_anim = animation_queue_set.removeFirst();
Iterator<AnimatorSet> it = recent_anim.anim_queue.listIterator();
try{
if (recent_anim.checkPocketFlag != 0) {
if(recent_anim.last_anim!=null)
recent_anim.last_anim.addListener(anim_listener_check_pocket);
else
start_set_anim();
} else {
if(recent_anim.last_anim!=null)
recent_anim.last_anim.addListener(anim_listener);
else
start_set_anim();
}
}catch(Exception e){
System.out.println("Exception Raised "+e);
e.printStackTrace();
}
/* recent_anim.last_anim.setStartDelay(0);
recent_anim.last_anim.start();*/
while (it.hasNext()) {
AnimatorSet aset = it.next();
aset.setStartDelay(0);
aset.start();
//(it.next()).setStartDelay(0);
//(it.next()).start();
it.remove();
}
/*
* if (animation_queue_set.isEmpty()) { read_from_queue = true; }
*/
}
private void startAnimations(int-ID,float[]值){
开关(ID){
案例1://43浮点值
/*
*
*long-timeinmill=System.currentTimeMillis();
System.out.println(“\n+JAVA:ANIMATION METHOD end TIME=“+timeinmill+”++\n”);
试一试{
FileWriter fstream=newfilewriter(“/sdcard/carromjava.txt”);
BufferedWriter out=新的BufferedWriter(fstream);
out.write(Long.toString(timeinmill));
out.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//关闭输出流
*/
int计数器=0;
int conX=0,conY=1;
布尔go=false;
如果(观察==0){
pos=getPositions();
手表=1;
}
长持续时间=(长)(值[41]*1000);/(值[40]*1000);
线性插值器线性插值器=新的线性插值器();//加速插值器();
减速器插补器线性_插补器1=新减速器插补器();
SetAnimation SetAnimation=新建SetAnimation();
setAnimation.duration=持续时间;
setAnimation.checkPocketFlag=(int)(值[40]);
setAnimation.product_sound_type=(int)(值[42]);
//AnimatorSet AnimatorSet=新的AnimatorSet();
//ArrayList animationFull=新的ArrayList();
//System.out.println(“Values length=“+Values.length”);
/*double dx=数学绝对值(位置[0]-(值[0]-板/2.0f));
double dy=数学abs(位置[1](值[1]-板/板/2.0f));
双距离=数学sqrt((双)(dx*dx)+(dy*dy));
//双velx=dx/值[41];
//双精度=dy/值[41];
double duraX=数学绝对值((dx/值[43])*1000;
double duraY=数学绝对值((dy/值[44])*1000;
double velocity=Math.sqrt((double)(值[43]*值[43])+(值[44]*值[44]);
双硬脑膜=距离/速度*/
对于(int i=-1;i<19;i++){
如果(i==-1){
//系统输出打印号(“硬币”);
//System.out.println(“x=“+pos[0]+”Y=“+pos[1]);
//System.out.println(“Animx=“+(值[0]-board_-sliker/2.0f)+”Animy=“+(值[1]-board_-sliker/2.0f));
ObjectAnimator anim1=ObjectAnimator.offload(前锋,
“translationX”,位置[计数器],值[计数器++]-板/板/2.0f);
ObjectAnimator anim2=ObjectAnimator.offload(前锋,
“translationY”,位置[计数器],值[计数器++]-板/板/2.0f);
//整定插值器
anim1.setInterpolator(线性插值器);
anim2.setInterpolator(线性插值器);
anim1.setDuration((长)值[41]);
anim2.setDuration((长)值[41]);
//如果((位置[conX]!=(值[conX]-板撞机/2.0f))&(位置[conY]!=(值[conY]-板撞机/2.0f))){
//System.out.println(“动画”);
//animationFull.add(anim1);
//animationFull.add(anim2);
AnimatorSet AnimatorSet=新的AnimatorSet();
//动画集。播放(动画1);
//动画集。播放(动画2);
动画师集。一起玩(动画1,动画2);
//animatorSet.setDuration((长)值[41]);
animatorSet.setInterpolator(线性插值器);
//animatorSet.start();
setAnimation.anim_queue.add(animatorSet);
setAnimation.last_anim=animatorSet;
// }
conX=+2;
conY=+2;
继续;
//中断;
}
ObjectAnimator anim1=ObjectAnimator.offload(
作品[i].coinImv,“translationX”,
值[counter++]-board_carrommen/2.0f);//2*i+2
ObjectAnimator anim2=ObjectAnimator.offload(
作品[i].coinImv,“翻译”,
值[counter++]-board_carrommen/2.0f);//2*i+2+1
anim1.setInterpolator(线性插值器);
anim2.setInterpolator(线性插值器);
anim1.setDuration((长)值[41]);
anim2.setDuration((长)值[41]);
//如果((位置[conX]!=(值[conX]-电路板/2.0f))和((位置[conY]!=(值[conY]-电路板/2.0f))){
//animationFull.add(anim1);
//animationFull.add(anim2);
AnimatorSet AnimatorSet=新的AnimatorSet();
动画师集。一起玩(动画1,动画2);
animatorSet.setInterpolator(线性插值器);
//animatorSet.setDuration((长)值[41]);
setAnimation.last_anim=animatorSet;
setAnimation.anim_queue.add(animatorSet);
// }
conX+=2;
conY+=2;
}
如果(观察!=0){
对于(int i=0;i如果您使用UI类来设置每个对象的动画,并且有许多对象同时具有动画,则始终建议您使用像OpenGL这样的低级API。或者,如果您对学习OpenGL不满意,您可以使用Cocoas 2D或其他优秀的API,它们只是在低级API之上创建了一个强大的框架。感谢您的帮助可估价推荐