Длительность проблемы в комплекте TranslateAnimation в Android - PullRequest
0 голосов
/ 24 января 2011

Мне нужно анимировать изображение в соответствии с (x, y) из одной точки в другую, затем из этой точки в другую точку и так далее. У меня около 300 очков. Для этого я использую следующий код.

/** code starts **/

public class CircleAnimation extends Activity implements OnPreparedListener {

    /** Called when the activity is first created. */

 ImageView imv1;
 int totalAnimTime = 0;
 double[][] points =  {{258.8505,143.2875,67},
        {259.642, 143.3665,120},
        {260.429, 142.992,240},
             {259.257, 139.3575,180},
        ......................
                   ......................
        {255.1335,146.8135,67},
        {255.1395,146.794,67},
        {255.0635,146.7785,67},
        {254.9045,146.797,1200}
         };
 int j=0;

 double loc[] = new double[2];
 double x1 = 0,y1 = 0,x2 = 0,y2 = 0,anim_end=0, xstart=258.8505, ystart=143.2875, xnow, ynow;
 protected boolean _active = true;
    protected int _animTime = 66;  
    int k=1;

    double xFactor = 1.779167, yFactor = 1.5;
    private int displayWidth, displayHeight;


 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        

        imv1 = (ImageView)findViewById(R.id.imv1);

        try{
            LaunchInAnimation();
        }catch(Exception e){
         e.printStackTrace();
        }

    }

    class LocalAnimationListener implements AnimationListener {

  public void onAnimationEnd(Animation animation){
   imv1.post(mLaunchSecondAnimation);    
   k = k ++;
  }
  public void onAnimationRepeat(Animation animation)
  {
  }

  public void onAnimationStart(Animation animation)
  {
  }
 };

 private Runnable mLaunchSecondAnimation = new Runnable(){

  public void run(){
   LaunchInAnimation();
  }
 };

 LocalAnimationListener MyAnimationListener = new LocalAnimationListener();


 public void LaunchInAnimation() {


  //animation
  if(k<points.length) {
   if(k==0) {
    x1 = xstart;
          y1 = ystart;
          anim_end=1;
   } else {
       x1 = points[k-1][0];
          y1 = points[k-1][1];
   }
      x2 = points[k][0];
      y2 = points[k][1];
      _animTime = (int) (points[k][2]);

      TranslateAnimation translateAnimation = new TranslateAnimation((float)x1, (float)x2, (float)y1, (float)y2);
      translateAnimation.setDuration(_animTime); 
      translateAnimation.setFillBefore(true);
      translateAnimation.setFillAfter(true);
      translateAnimation.setAnimationListener(MyAnimationListener);
      imv1.startAnimation(translateAnimation);

      totalAnimTime +=  _animTime;
  }
 }
}

/** code ends **/

Для завершения всех анимаций требуется totalAnimTime , но на это уходит меньше времени. Кроме того, это время варьируется от одного устройства к другому устройству. Для этого я столкнулся с проблемой синхронизации другого события. В чем проблема в этом коде? Есть ли другой лучший способ управления анимацией этого типа.

1 Ответ

0 голосов
/ 23 сентября 2011

Я сам возился с этой разницей в производительности, а затем переключился на OpenGL, чтобы выполнить весь мой рендеринг, и с тех пор нашел все намного более плавным и простым, когда вы понимаете, что делаете.

  • Если вы чувствуете, что OpenGL / SurfaceView слишком плотный для того, что вы просите, попробуйте использовать Canvas?

С одним из них должно быть намного проще, потому что они более стабильны от устройства к устройству.Анимации XML просто заставляют вас думать, что они анимации, их фактический X / Y никогда не меняется.Они должны «мерцать» от своего первоначального X / Y до «следующего шага X / Y» прямо перед тем, как нарисовать, если я прав ....

...