2015-02-16 7 views
9

Ich habe ein Bild eines Geschosses in einem ImageView, das die Animation übersetzt.Ist es möglich, Echtzeit-Koordinaten eines ImageView zu erhalten, während es sich in Translate animation befindet?

Ich muss Echtzeit-Koordinaten zeigen, um zu zeigen, wie weit es vom Ziel in Echtzeit ist.

ImageView myimage = (ImageView)findViewById(R.id.myimage);  
Animation animation = new TranslateAnimation(100, 200, 300, 400); 
animation.setDuration(1000); 
myimage.startAnimation(animation); 
animation.setRepeatCount(Animation.INFINITE); 

Ist es möglich, Echtzeit x und y Koordinaten des Bildes zu erhalten, während es TranslateAnimation tut?

Und wenn es nicht mit TranslateAnimation möglich ist, gibt es andere Möglichkeiten, die Echtzeit-Koordinaten des Bildes während der Bewegung gibt?

Ich versuchte -

int x = myimage.getLeft(); 
int y = myimage.getTop(); 

und

int[] firstPosition = new int[2]; 
myimage.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY); 
myimage.getLocationOnScreen(firstPosition); 
int x = firstPosition[0]; 
int y = firstPosition[1]; 

aber sowohl in die Art und Weise, ist es die statische Anfang des Image koordinieren zu geben.

+0

Ich weiß nicht, wie es programmatisch zu tun, aber Sie können immer Mathe verwenden :) in dieser Art von Situationen –

+0

Ja. Mathematik ist ein ultimativer Weg, aber ich suche, ob es noch einen anderen Weg in Androide gibt. Suchen, ob Androide eine bestimmte Funktion dafür oder eine andere Problemumgehung hat. –

+0

genau zu welchem ​​Zeitpunkt brauchen Sie diese Co-Ords und warum? –

Antwort

5

Hier ist ein komplettes Beispiel basiert auf, was user3249477 und Vikram sagte:

final TextView positionTextView = (TextView)findViewById(R.id.positionTextView); 
    ImageView myimage = (ImageView)findViewById(R.id.imageView);  

    ObjectAnimator translateXAnimation= ObjectAnimator.ofFloat(myimage, "translationX", 0f, 100f); 
    ObjectAnimator translateYAnimation= ObjectAnimator.ofFloat(myimage, "translationY", 0f, 100f);  
    translateXAnimation.setRepeatCount(ValueAnimator.INFINITE);  
    translateYAnimation.setRepeatCount(ValueAnimator.INFINITE); 

    AnimatorSet set = new AnimatorSet(); 
    set.setDuration(1000); 
    set.playTogether(translateXAnimation, translateYAnimation); 
    set.start(); 

    translateXAnimation.addUpdateListener(new AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      imageXPosition = (Float)animation.getAnimatedValue(); 
     } 
    }); 

    translateYAnimation.addUpdateListener(new AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      imageYPosition = (Float)animation.getAnimatedValue(); 
      String position = String.format("X:%d Y:%d", (int)imageXPosition, (int)imageYPosition); 
      positionTextView.setText(position); 
     } 
    }); 
+0

Bekam den Punkt, wie es gemacht wurde. Danke vielmals. Ich bin einen Monat alt in der Codierung Android und sieht aus, als müsste ich noch viel lernen. –

+1

Kein Problem - froh, dass es geholfen hat :) – Spiri

3

Sie können eine ObjectAnimator (API 11+) verwenden:

ImageView iv = (ImageView)findViewById(R.id.markerRed); 

// Create animators for x and y axes 
ObjectAnimator oax = ObjectAnimator.ofFloat(iv, "translationX", 0f, 100f); 
ObjectAnimator oay = ObjectAnimator.ofFloat(iv, "translationY", 0f, 100f); 
oax.setRepeatCount(Animation.INFINITE); 
oay.setRepeatCount(Animation.INFINITE); 

// Combine Animators and start them together 
AnimatorSet set = new AnimatorSet(); 
set.setDuration(1000); 
set.playTogether(oax, oay); 
set.start(); 

dann die Animation Werte wie folgt holen:

Log.e("TAG", "X: " + oax.getAnimatedValue() + " Y:" + oay.getAnimatedValue()); 

Wenn Sie diese Werte auf die ursprüngliche ImageView ‚s Koordinaten hinzufügen, Sie erhalten den aktuellen Standort.

+0

oax.getAnimatedValue() und oay.getAnimatedValue() geben nur noch die Anfangskoordinaten an. nicht aktualisieren. –

+0

Das Protokoll liest nur die gleichen ursprünglichen Koordinaten. –

+0

@ Gissipi_453 wie und wann nennst du das? Die Animation muss begonnen haben und wird gerade animiert. – Simas

3

Ich hatte diese Idee: Sie können den Standard TranslateAnimation erweitern und jeden Schritt der Animation abfangen, indem Sie die applyTransformation Methode überschreiben.

Werfen Sie einen Blick auf diese unvollständig/ungetestet Schnipsel:

private class ObservableTranslateAnimation extends TranslateAnimation{ 

    private float matrixValues[] = new float[9]; 
    private float actualDx; 
    private float actualDy; 

    public ObservableTranslateAnimation(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    // ... more constructors 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     super.applyTransformation(interpolatedTime, t); 
     //After that super is called, the matrix gets updated! 

     //get the current matrix and extract what you need 
     t.getMatrix().getValues(matrixValues); 
     actualDx = matrixValues[Matrix.MTRANS_X]; 
     actualDy = matrixValues[Matrix.MTRANS_Y]; 

     /* 
      Notify someone here (a listener?), or just read the values of actualDx, actualDy from outside 
      You can also play around with the other Matrix values. 
     */ 
    } 
}