在Android中以animation方式将ImageView移动到不同的位置

我在RelativeLayout有几个ImageView 。 现在,当用户点击任何一个ImageView,我希望它被微妙的animation移动到指定的位置。

例如; 我最初设置与ImageView关联的LayoutParams边距为layoutparams1.setMargins(90,70,0,0); 然后将其添加到布局。

而当imageview被挖掘,我想它的新位置是200,200 ,animation。

那么,这可能吗? 如果是,那么怎么样?

请注意,我有两个RelativeLayout和它的所有子ImageView以编程方式创build。

而且我对android开发很陌生,因此预计会有详尽的答案。

Solutions Collecting From Web of "在Android中以animation方式将ImageView移动到不同的位置"

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

更新:问题是, View实际上仍然在它的旧位置。 所以我们必须在animation完成时移动它。 要检测animation何时完成,我们必须创build我们自己的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会在新的地方再次被解雇。 现在animation会把它移到更下面的位置,所以你可能想把xy保存在一个variables中,这样在onAnimationEnd()onAnimationEnd()它移动到修复位置。

使用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; } 

在下面的代码中,我dynamic地在框架布局的中心添加了一个图像视图。 添加后,我增加缩放,并设置阿尔法给予缩放效果,完成animation后,我只是把我的图像视图的一个位置翻译到另一个位置。

在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); 

在图像视图中添加animation

  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();