Android 什么';将视图从一个坐标设置为另一个坐标的正确方法是什么?
我想做以下几点。我有一组按钮,上面有一些图标。当用户点击一个图标时,我想引入一个新的视图,该视图从点击图标的同一坐标开始,然后该新视图将转移到屏幕上的其他位置,当它到达时将被删除 我知道如何创建新视图并将其添加/删除到父RelativeLayout(它是否应该是RelativeLayout?)以及所有这些。我不清楚的是,如何获得点击按钮的绝对坐标(因为它只是父布局中的一个元素,在另一个父布局中),然后设置其坐标并应用动画,然后如何通知我它已到达它要去的地方,以便我可以移除它Android 什么';将视图从一个坐标设置为另一个坐标的正确方法是什么?,android,animation,Android,Animation,我想做以下几点。我有一组按钮,上面有一些图标。当用户点击一个图标时,我想引入一个新的视图,该视图从点击图标的同一坐标开始,然后该新视图将转移到屏幕上的其他位置,当它到达时将被删除 我知道如何创建新视图并将其添加/删除到父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();
我只是将视图添加到框架布局的中心位置,并将视图转换为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过渡动画在布局上移动视图。 请查看下面提到的链接,以获得有关在布局中设置视图动画的一些想法
好的,我自己已经想好了,如果没有人插话回答,我明天会发布,供其他人参考。你也有这方面的教程吗?你有这方面的教程吗,这样它会对我有帮助,@Real_steel 4819,对不起,朋友,我没有教程…只是我在回答中写的东西什么是
getStickerIdFromButton(v);
?@ChadBingham,如果我没记错的话,它是一个帮助器方法,允许我找到用户试图从一个地方拖到另一个地方的项目的id。函数getLocationOnScreen()中的C样式让我想起pipe()unix函数。。