Déplacer une vue D'image à une position différente dans L'animation de manière Android

j'en ai plusieurs ImageViews: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 ImageViewlayoutparams1.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 ImageViews créé par programmation.

Et je suis nouveau sur android développement d'une forme élaborée réponse est attendue.

22
demandé sur Kushal 2012-06-21 22:24:13

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.

51
répondu D-32 2016-05-03 19:29:51

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;
}
7
répondu ArMo 372 2015-08-04 06:00:45

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();
2
répondu duggu 2015-09-18 06:43:57