2012-06-21 65 views
21

我在RelativeLayout中有幾個ImageView s。現在,當用戶點擊任何ImageView時,我希望它以微妙的動畫移動到指定的位置。在Android中以動畫方式將ImageView移動到不同的位置

例如;我最初將與ImageView關聯的LayoutParams的邊距設置爲layoutparams1.setMargins(90,70,0,0);,然後將其添加到佈局。

並且當點擊圖像視圖時,我希望它的新位置是200,200,並帶有動畫。

那麼,有可能嗎?如果是的話,那麼如何?

請注意,我同時使用編程方式創建了RelativeLayout及其所有孩子ImageView

我剛剛接觸android開發,因此預計會有詳盡的答案。

回答

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

imageView.startAnimation(animation); 

UPDATE: 的問題是,View實際上仍是它的老位置。所以我們必須在動畫完成時移動它。爲了檢測當動畫完成後,我們必須建立我們自己的animationListener(裏面我們activity類):

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) { 
    } 

} 

所以onClickEvent將得到再次發射它的新的地方。 動畫現在會將其移動更多,因此您可能需要將xy保存在一個變量中,以便在onAnimationEnd()中將其移至修復位置。

+2

作品

添加圖像視圖!!但在ImageView的新位置,它不響應任何輕擊事件,並且,如果我單擊到其之前的位置,則同一Imageview動畫的另一個實例。任何方式來解決它? – Kushal

+0

非常感謝!但在onAnimationEnd()中重新定位會導致imageview閃爍一次。 : -/ – Kushal

+1

在設置LayoutParms之前,您必須清除動畫(參見上面) –

4

也比較好用ObjectAnimator。這一觀點處於新的位置。 例如:

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

實際上最喜歡這一個。 – creativecreatorormaybenot

2

在以下代碼我在中心上框架佈局動態地添加一個圖像圖。添加後,我增加縮放和設置阿爾法給予縮放效果,完成動畫後,我只是將我的圖像視圖一個位置翻譯到另一個位置。上的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); 

添加動畫圖像視圖

 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

這是一個簡單而且非常好的解決方案。有用.. –