Przenieś obraz do innej pozycji w Animowany sposób w Androidzie

Mam kilka ImageView s W RelativeLayout. teraz, gdy użytkownik dotknie dowolnego obrazu ImageView, chcę, aby został przeniesiony do określonego miejsca z subtelną animacją.

Np; początkowo ustawiłem marginesy dla LayoutParams skojarzonego z ImageView jako layoutparams1.setMargins(90,70,0,0);, a następnie dodałem je do układu.

A kiedy imageview zostanie uruchomiony, chciałbym, aby jego nowa lokalizacja była 200,200, z animacją.

Czy to możliwe? jeśli tak, to jak?

Zauważ, że mam zarówno RelativeLayout jak i całe jego dziecko ImageView s stworzony programowo.

I jestem nowy w rozwoju Androida, więc oczekiwana jest szczegółowa odpowiedź.

Author: Kushal, 2012-06-21

3 answers

TranslateAnimation animation = new TranslateAnimation(0, 50, 0, 100);
animation.setDuration(1000);
animation.setFillAfter(false);
animation.setAnimationListener(new MyAnimationListener());

imageView.startAnimation(animation);

Aktualizacja: Problem w tym, że View jest nadal w swojej starej pozycji. Więc musimy przenieść go po zakończeniu animacji. Aby wykryć, kiedy animacja jest skończona, musimy utworzyć własną animationListener (wewnątrz naszej klasy activity):

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) {
    }

}

Więc onClickEvent zostaną zwolnieni ponownie w nowym miejscu. Animacja przesunie ją teraz jeszcze bardziej w dół, więc możesz zapisać x i y w zmiennej, aby w onAnimationEnd() przenieść ją nie do poprawki miejsce.

 51
Author: D-32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-03 19:29:51

Jest również lepsze, że używać ObjectAnimator. ten widok przesunięcia w nowej pozycji. na przykład:

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
Author: ArMo 372,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 06:00:45

W poniższym kodzie dodaję widok obrazu w środku na układzie ramki dynamicznie. Po dodaniu zwiększam skalowanie i ustawiam Alfę, aby dać efekt powiększenia, a po pełnej animacji po prostu tłumaczę mój widok obrazu z jednej pozycji na drugą pozycję.

Dodaj widok obrazu na 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);

Dodaj animację w widoku obrazu

       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
Author: duggu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 06:43:57