2012-06-16 10 views
5

Znam wiele sposobów na uzyskanie wartości lokalizacji widoku.Android: Czy jest jakiś sposób, aby uzyskać najnowszą pozycję widoku po Tłumaczeniu?

getLocationOnScreen() 
getLocationInWindow() 
getLeft() 

Jednak żadne z nich nie zwraca rzeczywistej lokalizacji widoku Przenieśliłem metodą startAnimation(), ale tylko oryginalną lokalizację.

Teraz przejdźmy do widoku, który przesuwa się w prawo o 10 pikseli na każde kliknięcie (pomijam układ, ponieważ możesz po prostu umieścić dowolny widok w głównym pliku XML i nadać mu 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); 
} 

} 

Jak widać, to nie działa jak zamierzałem, ponieważ getLocationOnScreen() zawsze zwraca tę samą wartość (w moim przypadku, 0), a doen't odzwierciedlać wartość użyłem w TranslateAnimation ..

Każdy pomysł?

Odpowiedz

2

Zakładając, że używasz Androida < 3.0, twoje pytanie może być w podobnym tonie co moje Zapytałem: here. Zasadniczo animacje są oddzielne od samego widoku, tzn. Android animuje kopię Twojego widoku. Dlatego getLocationOnScreen() zawsze zwraca 0. To nie jest widok, który się poruszył (animacja), to była ta kopia, która się poruszyła (animowana). Jeśli widzisz odpowiedzi na moje pytanie, ten problem został rozwiązany w późniejszych wersjach Androida.

+0

Dzięki za banda. – Quv

0

Animacje na pierniku z Androidem i poniżej nie zmieniają w żaden sposób widoku, zmieniają tylko jego sposób wyświetlania.

Jedynym sposobem na uzyskanie nowej pozycji jest jej obliczenie.

+0

Dzięki. Użyłbym tablicy i sam ją obliczyłem ... – Quv

2

Cóż, jeśli próbujesz sprawdzić, ile pikseli obraz przesunął się podczas/po jego animacji, możesz otworzyć obiekt Transformacja na animacji.

Oto przykład przy użyciu 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) { 
     } 
    }); 

I nie może być dokładnie poprawne indeksy tablicy dla nich zdecydowanie korzystać Matrix.toString() i spojrzeć na yourself wartości. xTraveled i yTraveled podadzą odległość przebytą przez TranslateAnimation we wskazanym czasie (w tym przypadku na końcu animacji).

Powiązane problemy