2013-10-31 13 views
5

Ich habe versucht, eine Aktivitätsmethode ein Bild in einen bestimmten Winkel drehen. Die Rotation funktioniert, aber das Problem ist, dass die Methode jede Sekunde aufgerufen wird, aber nur die ersten Male rotiert. An einem bestimmten Punkt steht das Bild, das gerade animiert wird, still, obwohl die Animation mit verschiedenen Werten eingerichtet und gestartet wird! die das Bild verschieben sollen, wie es die ersten Male getan hat.Android Ansicht Rotation nicht nach ein paar setAnimation Anrufe

private void animateNeedle(final float sfAngle) 
{ 
    final View viewNeedle = findViewById(R.id.needle); 
    final RotateAnimation needleAnimation; 

    RotateAnimation anim; 

    anim = new RotateAnimation(0, 
     sfAngle, 
     m_nNeedleWidth/2, 
     m_nNeedleHeight); 
    anim.setDuration(200); 
    anim.setFillAfter(true); 
    viewNeedle.setAnimation(anim); 
    anim.setAnimationListener(new AnimationListener() 
    { 

     @Override 
     public void onAnimationEnd(final Animation animation) 
     { 
      viewNeedle.clearAnimation(); 
     } 

     @Override 
     public void onAnimationRepeat(final Animation animation) 
     { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onAnimationStart(final Animation animation) 
     { 
      // TODO Auto-generated method stub 
     } 
    }); 

    anim.start(); 
    findViewById(android.R.id.content).postInvalidate(); 
} 

Was mache ich falsch? Ich habe sichergestellt, dass die Funktion während der Animation nicht zweimal aufgerufen wird, aber es hilft nicht.

+0

wo rufen Sie die Funktion aus? – LeeNeverGup

+0

Aus einem Event, um genau zu sein, ein Audio-Samples erhalten, aber das passiert nur einmal pro Sekunde, um zu überprüfen, ob es ein thread-bezogenes Problem ist. –

+0

Sind Sie sicher, dass 'sfAngle' bestanden immer von Null ist? –

Antwort

2

Das Problem war, dass es nicht auf dem Haupt-Thread ausgeführt wurde, um es zu beheben wir verwendet:

anim = new RotateAnimation(m_lastAngle, 
           sfAngle, 
           viewNeedle.getWidth()/2, 
           viewNeedle.getHeight()); 
    anim.setDuration(1000); 
    anim.setFillAfter(true); 
    viewNeedle.setAnimation(anim); 
    anim.setAnimationListener(new AnimationListener() 
    { 
     @Override 
     public void onAnimationEnd(final Animation animation) 
     { 
      // viewNeedle.clearAnimation(); 
     } 

     @Override 
     public void onAnimationRepeat(final Animation animation) 
     { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onAnimationStart(final Animation animation) 
     { 
      m_lastAngle = sfAngle; 
     } 
    }); 

    runOnUiThread(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      viewNeedle.startAnimation(anim); 
      findViewById(android.R.id.content).invalidate(); 
     } 
    }); 

Auch haben wir:

final View viewNeedle = findViewById(R.id.needle); 
    viewNeedle.getViewTreeObserver().addOnGlobalLayoutListener(
      new OnGlobalLayoutListener() 
      { 
       @Override 
       public void onGlobalLayout() 
       { 
        scaleView(viewNeedle); 
       } 

       /** 
       * Scale a view. 
       * 
       * @param viewToScale - View to scale. 
       */ 
       private void scaleView(final View viewToScale) 
       { 
        int height = (int) (viewToScale.getHeight()/GraphicsPoint 
          .getScalePoint().y); 
        int width = (int) (viewToScale.getWidth()/GraphicsPoint 
          .getScalePoint().x); 
        final LayoutParams layoutParams = viewToScale 
          .getLayoutParams(); 
        layoutParams.height = height; 
        layoutParams.width = width; 
        viewToScale.setLayoutParams(layoutParams); 
        viewToScale.getViewTreeObserver() 
          .removeOnGlobalLayoutListener(this); 
       } 
      }); 
2

Ich habe versucht, den Code zu verwenden und es funktioniert Animation später oft zu nennen .. ich diesen Code hinzufügen aufgerufen werden, wenn die Drehung zu Ende kommt:

.. 
       viewNeedle.startAnimation(anim); 
       anim.start(); 
.. 

so eine wiederholte Animation machen wird es gerade wie folgt aus:

@Override 
      public void onAnimationEnd(final Animation animation) 
      { 
       viewNeedle.clearAnimation(); 
       viewNeedle.startAnimation(anim); 
       anim.start(); 
      } 

so kann ich diese Animation nennen mehr als einmal ..

hoffen, dass Ihnen helfen ..

+0

Danke, aber das war nicht das Problem, die Lösung lief die Animation auf dem Hauptthread, ich werde jetzt die Lösung posten. – TomF

+0

Danke Mann, das funktioniert! Dies sollte die akzeptierte Antwort sein. Ich weiß, dass das Problem bei UI Thread liegt, aber das Aufrufen von 'start()' auf dem Animationsobjekt ist eine viel kürzere Lösung. –

Verwandte Themen