2012-06-16 6 views
5

Conosco molti modi per ottenere i valori di posizione di una vista.Android: Esiste un modo per ottenere l'ultima posizione della vista dopo TranslateAnimation?

getLocationOnScreen() 
getLocationInWindow() 
getLeft() 

Tuttavia, nessuno di loro in realtà restituisce la posizione corrente del Vista mi sono trasferito da startAnimation() metodo, ma solo la posizione originale.

Quindi, ora facciamo una vista che si sposta verso destra di 10 pixel su ciascun clic (sto omettendo il layout, dal momento che puoi semplicemente posizionare qualsiasi vista nel tuo XML principale e assegnarlo a onClickListener).

public class AndroidTestActivity extends Activity implements OnClickListener { 
LinearLayout testView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    testView = (LinearLayout) this.findViewById(R.id.test); 
    testView.setOnClickListener(this); 
} 

public void onClick(View v) { 
    int[] pLoS = new int[2]; 
    testView.getLocationOnScreen(pLoS); 
    TranslateAnimation move = new TranslateAnimation(pLoS[0], pLoS[0] + 10, 0f, 0f); 
    move.setFillAfter(true); 
    move.setFillEnabled(true); 
    testView.startAnimation(move); 
} 

} 

Come potete vedere, questo non funziona come ho inteso, dal momento che getLocationOnScreen() restituisce sempre lo stesso valore (nel mio caso, 0), e doen't riflette il valore che ho usato in TranslateAnimation .. .

Qualche idea?

risposta

2

Supponendo che si stia utilizzando Android < 3.0, allora la tua domanda potrebbe essere simile a quella che ho chiesto a here. Fondamentalmente le animazioni sono separate dalla vista stessa, ad esempio, Android anima una copia della vista. Ecco perché getLocationOnScreen() restituisce sempre 0. Non è la vista che si è spostata (animata) era la copia spostata (animata). Se vedi le risposte alla mia domanda questo problema è stato risolto nelle versioni successive di Android.

+0

Thanks a Bunch. – Quv

0

animazioni su Android Gingerbread e al di sotto in realtà non cambiano la vista in qualsiasi modo, solo cambiare il modo in cui viene mostrato.

l'unico modo per ottenere la nuova posizione è di calcolo.

+0

Grazie. Userei un array e lo calcolerei da solo ... – Quv

2

Beh, se si sta cercando di vedere quanti pixel la vista si è spostata durante/dopo la sua animazione, quindi è possibile aprire l'oggetto di trasformazione sull'animazione.

Ecco un esempio utilizzando l'AnimationListener:

animation.setAnimationListener(new Animation.AnimationListener() { 
     @Override 
     public void onAnimationStart(Animation animation) { 
     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      Transformation trans = new Transformation(); 
      // startTime + duration = end of animation 
      int endTime = animation.getStartTime()+animation.getDuration(); 
      animation.getTransformation(endTime, trans); 

      Matrix transformationMatrix = trans.getMatrix(); 
      float[] matrixVals = new float[9]; 
      transformationMatrix.getValues(matrixVals); 
      float xTraveled = matrixVals[2]; 
      float yTraveled = matrixVals[5]; 
      // do something with them here... 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 
     } 
    }); 

Potrei non essere esattamente corretto negli indici di array di questi, sicuramente utilizzare Matrix.toString() e guardare i valori da soli. xVisita e yTraveled ti fornirà la quantità di distanza percorsa da TranslateAnimation al momento indicato (in questo caso, al termine dell'animazione).