Déplacer une vue D'image à une position différente dans L'animation de manière Android
j'en ai plusieurs ImageView
s:RelativeLayout
. maintenant, lorsque L'utilisateur tape une partie de L'ImageView, je veux qu'elle soit déplacée à un endroit précis avec une animation subtile.
par exemple, j'ai d'abord définir les marges LayoutParams
associé à un ImageView
layoutparams1.setMargins(90,70,0,0);
et faites-le Ajouter à la mise en page.
et quand imageview est approché, j'aimerais son nouvel emplacement soit 200,200
avec l'animation.
alors, est-ce possible? si oui, comment?
Notez que j'ai les deux RelativeLayout
et tout son enfant ImageView
s créé par programmation.
Et je suis nouveau sur android développement d'une forme élaborée réponse est attendue.
3 réponses
TranslateAnimation animation = new TranslateAnimation(0, 50, 0, 100);
animation.setDuration(1000);
animation.setFillAfter(false);
animation.setAnimationListener(new MyAnimationListener());
imageView.startAnimation(animation);
mise à jour:
Le problème est que le View
est en fait toujours dans sa vieille position. Donc, nous devons nous déplacer lorsque l'animation est terminée. Pour détecter lorsque l'animation est terminée, nous devons créer nos propres animationListener
(à l'intérieur de notre activity
class):
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
va faire virer de nouveau à la nouvelle place.
L'animation va maintenant la déplacer encore plus vers le bas, donc vous pourriez vouloir sauver le x
et y
dans une variable, de sorte que, dans la onAnimationEnd()
vous ne le déplacez pas vers un emplacement de réparation.
est aussi mieux que l'utilisation ObjectAnimator
. cette vue de mouvement dans une nouvelle position.
par exemple :
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;
}
dans le code ci-dessous j'ajoute une vue d'image au centre sur la disposition du cadre dynamiquement. Après avoir ajouté j'augmente la mise à l'échelle et positionne alpha pour donner l'effet de zoom et après l'animation complète je traduis juste ma vue d'image d'une position à une autre.
ajouter une vue d'image sur 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);
ajouter de l'animation sur la vue d'image
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();