将视图从一个坐标移动到另一个坐标的正确方法是什么?
我想做以下事情。我有一组按钮,其上有一些图标。当用户点击一个图标时,我想引入一个新的视图,它以与点击图标相同的坐标开始,然后该新视图会移动到屏幕上的其他位置,并在它到达时被删除。将视图从一个坐标移动到另一个坐标的正确方法是什么?
我知道如何创建一个新的视图并将其添加/删除到父亲RelativeLayout(它不应该是一个RelativeLayout?)以及所有这些。我不清楚的是如何获取被点击的按钮的绝对坐标(因为它只是父布局内的一个元素,在另一个父布局内),然后设置坐标并应用动画,然后通知我它已到达目的地,以便我可以将其删除?
无论如何,找不到一个如何做到这一点的例子,所以希望有人能指出我正确的方向。
所以,事实证明,这比我想象的要简单得多。
我创建了一个全屏幕RelativeLayout,我只在动画发生时显示。
我得到我喜欢这个埋按钮的起始位置(这很有趣,看看在Java中使用这些C风格的编码机制,他们是非常罕见的,这些天:
int fromLoc[] = new int[2];
v.getLocationOnScreen(fromLoc);
float startX = fromLoc[0];
float startY = fromLoc[1];
所以,现在我有我的起点点。
我的终点是一个绝对坐标在屏幕上,你可以分配自己的喜好
然后我做一点动画助手类,它让我通过在所有的坐标,回调,和动画的持续时间
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;
}
}
,我们需要一个倾听者,让我们知道当动画做是为了清除它
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();
你有这个教程,所以它会帮助我, – ManishSB 2014-08-07 19:04:06
@ Real_steel4819,抱歉朋友,我没有教程...只是我在这个答案中写的东西 – 2014-08-07 22:45:26
什么是'getStickerIdFromButton(v);'? – 2015-10-25 00:08:56
我只需将我的视图添加到框架布局的中心位置,然后将我的视图转换为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);
添加图片视图图像视图添加动画
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过渡动画搬过来布局的视图。 看看下面提到的链接,以获得布局中动画视图的一些想法。
好吧,我理解了它自己,如果没有人有答案风铃,我会后,明天,为他人参考。 – 2012-03-09 06:39:13
你也有这个教程吗? – ManishSB 2014-08-07 19:44:52