将视图从一个坐标移动到另一个坐标的正确方法是什么?

我想做以下事情。 我有一组button,其上有一些图标。 当用户点击一个,我想介绍一个新的视图,开始在与挖掘图标相同的坐标,然后新的视图将转移到屏幕上的其他位置,当它到达那里被删除。

我知道如何创build一个新的视图,并添加/删除它的父亲RelativeLayout(它不应该是一个RelativeLayout?)等等。 我不清楚的是如何获取button的button的绝对坐标(因为它只是父布局内的一个元素,在另一个父布局内),然后设置其坐标并应用animation,然后通知我它已经到达了它的位置,以便我可以删除它?

无论如何,找不到如何做到这一点的例子,所以希望有人能指出我正确的方向。

所以,事实certificate,这比我想象的要简单得多。

我创build了一个全屏的RelativeLayout,我只在animation发生的时候显示。

我得到了像这样被埋起来的button的起始位置(在Java中看到这些C风格的编码机制是很有趣的,现在它们是非常罕见的:

int fromLoc[] = new int[2]; v.getLocationOnScreen(fromLoc); float startX = fromLoc[0]; float startY = fromLoc[1]; 

所以,现在我有我的出发点。

我的终点是在屏幕上的绝对坐标,你可以指定,但是你希望

然后,我做了一个小animation助手类,让我通过所有的坐标,callback,和animation的持续时间

  public class Animations { public Animation fromAtoB(float fromX, float fromY, float toX, float toY, AnimationListener l, int speed){ Animation fromAtoB = new TranslateAnimation( Animation.ABSOLUTE, //from xType fromX, Animation.ABSOLUTE, //to xType toX, Animation.ABSOLUTE, //from yType fromY, Animation.ABSOLUTE, //to yType toY ); fromAtoB.setDuration(speed); fromAtoB.setInterpolator(new AnticipateOvershootInterpolator(1.0f)); if(l != null) fromAtoB.setAnimationListener(l); return fromAtoB; } } 

我们需要一个听众让我们知道什么时候animation完成清除它

  AnimationListener animL = new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { //this is just a method to delete the ImageView and hide the animation Layout until we need it again. clearAnimation(); } }; 

最后,我们把它们放在一起,然后按GO

 int fromLoc[] = new int[2]; v.getLocationOnScreen(fromLoc); float startX = fromLoc[0]; float startY = fromLoc[1]; RelativeLayout rl = ((RelativeLayout)findViewById(R.id.sticker_animation_layout)); ImageView sticker = new ImageView(this); int stickerId = getStickerIdFromButton(v); if(stickerId == 0){ stickerAnimationPlaying = false; return; } float destX = 200.0f;//arbitrary place on screen float destY = 200.0f;//arbitrary place on screen sticker.setBackgroundResource(stickerId); sticker.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); rl.addView(sticker); Animations anim = new Animations(); Animation a = anim.fromAtoB(startX, startY, destX, destY, animL,750); sticker.setAnimation(a); a.startNow(); 

我只是在框架布局的中心位置上添加我的视图,并将我的视图转换为x轴和y轴。 尝试下面的代码: –

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

您可以使用Android转换animation在布局上移动视图。 看看下面提到的链接,以获得布局中animation视图的一些想法。

https://github.com/lgvalle/Material-Animations