2012-06-21 2 views
21

Ich habe mehrere ImageView s in einem RelativeLayout. Wenn der Benutzer jetzt auf ein ImageView-Element tippt, möchte ich, dass es mit subtiler Animation an einen bestimmten Ort verschoben wird.Verschieben Sie ein ImageView auf andere Weise in animierter Weise in Android

Eg; Ich habe zunächst Margen für LayoutParams mit einem ImageView als layoutparams1.setMargins(90,70,0,0); festgelegt und dann es zum Layout hinzugefügt.

und wenn imageview angetippt wird, möchte ich seinen neuen Standort 200,200 mit Animation haben.

Also, ist es möglich? Wenn ja, wie?

Beachten Sie, dass ich sowohl RelativeLayout als auch alle zugehörigen untergeordneten Elemente ImageView programmgesteuert erstellt habe.

Und ich bin neu in Android-Entwicklung, so dass eine ausführliche Antwort erwartet wird.

Antwort

49
TranslateAnimation animation = new TranslateAnimation(0, 50, 0, 100); 
animation.setDuration(1000); 
animation.setFillAfter(false); 
animation.setAnimationListener(new MyAnimationListener()); 

imageView.startAnimation(animation); 

UPDATE: Das Problem ist, dass die View eigentlich immer noch in ihm alte Position. Also müssen wir es verschieben, wenn die Animation beendet ist. Zu erkennen, wenn die Animation beendet ist erstellen wir müssen unsere eigenen animationListener (in unserem activity Klasse):

private class MyAnimationListener implements AnimationListener{ 

    @Override 
    public void onAnimationEnd(Animation animation) { 
     imageView.clearAnimation(); 
     LayoutParams lp = new LayoutParams(imageView.getWidth(), imageView.getHeight()); 
     lp.setMargins(50, 100, 0, 0); 
     imageView.setLayoutParams(lp); 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { 
    } 

    @Override 
    public void onAnimationStart(Animation animation) { 
    } 

} 

So wird die onClickEvent wieder gefeuert werden es neuen Ort ist. Die Animation wird es jetzt noch weiter nach unten verschieben, also möchten Sie vielleicht die x und y in einer Variablen speichern, so dass Sie sie in onAnimationEnd() nicht an einen festen Ort verschieben.

+2

Works !! Aber an der neuen Position von ImageView reagiert es nicht auf Tippereignisse. Wenn ich auf die vorherige Position klicke, wird eine weitere Instanz desselben Bilds animiert. Irgendeine Möglichkeit, es zu beheben? – Kushal

+0

Vielen Dank !! Die Neupositionierung in 'onAnimationEnd()' bewirkt jedoch, dass die Bildansicht einmal flackert. : -/ – Kushal

+1

Bevor Sie die LayoutParms setzen, müssen Sie die Animation löschen (siehe oben) –

4

ist auch besser, dass ObjectAnimator verwenden. Diese Ansicht in neue Position verschieben. zum Beispiel:

ImageView splash ; 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float tx = event.getX(); 
    float ty = event.getY(); 

    int action = event.getAction(); 
    switch(action) { 
     case MotionEvent.ACTION_DOWN: 
      tx = event.getX(); 
      ty = event.getY(); 

      //  findViewById(R.id.character).setX(tx-45); 
      //  findViewById(R.id.character).setY(ty-134); 

      ObjectAnimator animX = ObjectAnimator.ofFloat(splash, "x", tx-45); 
      ObjectAnimator animY = ObjectAnimator.ofFloat(splash, "y", ty-134); 
      AnimatorSet animSetXY = new AnimatorSet(); 
      animSetXY.playTogether(animX, animY); 
      animSetXY.start(); 

      break; 
     default: 
    } 
    return true; 
} 
+0

Mochte dieses eine das beste tatsächlich. – creativecreatorormaybenot

2

Im folgenden Code, den ich ein Bild Ansicht bin das Hinzufügen dynamisch auf Frame-Layout in der Mitte. Nach dem Hinzufügen vergrößere ich die Skalierung und setze Alpha, um einen Zoom-Effekt zu erhalten. Nach der vollständigen Animation übersetze ich einfach meine Bildansicht um eine Position an eine andere Position.

Add Bildansicht auf framelayout

imgHeart = new ImageView(getBaseContext()); 
    imgHeart.setId(R.id.heartImage); 
    imgHeart.setImageResource(R.drawable.material_heart_fill_icon); 
    imgHeart.setLayoutParams(new FrameLayout.LayoutParams(50, 50, Gravity.CENTER)); 
    mainFrameLaout.addView(imgHeart); 

hinzufügen Animation auf Bild Ansicht

 imgHeart.animate() 
      .scaleXBy(6) 
      .scaleYBy(6) 
      .setDuration(700) 
      .alpha(2) 
      .setListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationStart(Animator animation) { 

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
        imgHeart.animate() 
          .scaleXBy(-6f).scaleYBy(-6f) 
          .alpha(.1f) 
          .translationX((heigthAndWidth[0]/2) - minusWidth) 
          .translationY(-((heigthAndWidth[1]/2) - minusHeight)) 
          .setDuration(1000) 
          .setListener(new Animator.AnimatorListener() { 
           @Override 
           public void onAnimationStart(Animator animation) { 
           } 

           @Override 
           public void onAnimationEnd(Animator animation) { 
           // remove image view from framlayout 
           } 
           @Override 
           public void onAnimationCancel(Animator animation) { 
           } 

           @Override 
           public void onAnimationRepeat(Animator animation) { 
           } 
          }).start(); 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 

       } 
      }).start(); 
+1

das ist eine einfache und eine sehr schöne Lösung. Es klappt.. –

Verwandte Themen