Android 如何同时平滑地制作多个动画?

Android 如何同时平滑地制作多个动画?,android,android-animation,Android,Android Animation,我正在开发一款carrom游戏。我试图通过在队列中添加动画,将大约20个图像视图(硬币)组合在一起。。。。。单个视图(硬币)的动画效果很好,但当我全部设置动画时,它会变得非常慢。我希望所有的硬币都能毫无问题地同时动画。这是我写的代码 private void startAnimations(int ID, float[] values) { switch (ID) { case 1: // 43 float values /* *

我正在开发一款carrom游戏。我试图通过在队列中添加动画,将大约20个图像视图(硬币)组合在一起。。。。。单个视图(硬币)的动画效果很好,但当我全部设置动画时,它会变得非常慢。我希望所有的硬币都能毫无问题地同时动画。这是我写的代码

    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之上创建了一个强大的框架。

感谢您的帮助可估价推荐