Android -> как анимировать на новую позицию - PullRequest
15 голосов
/ 02 сентября 2011

Вот простая анимация xml для Android:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="-110"
    android:toYDelta="-110" android:duration="1000" android:fillAfter="true" />

Я хочу переместить анимированный объект из центра экрана на 0, 0 позиций. Как мне это сделать (должно работать на всех разрешениях экрана)


Мой ответ:

Спасибо, ребята, за вашу помощь. Но я решил проблему другим способом, динамически, без XML. Вот полный код этого метода:

public void replace(int xTo, int yTo, float xScale, float yScale) {
        // create set of animations
        replaceAnimation = new AnimationSet(false);
        // animations should be applied on the finish line
        replaceAnimation.setFillAfter(true);

        // create scale animation
        ScaleAnimation scale = new ScaleAnimation(1.0f, xScale, 1.0f, yScale);
        scale.setDuration(1000);

        // create translation animation
        TranslateAnimation trans = new TranslateAnimation(0, 0,
                TranslateAnimation.ABSOLUTE, xTo - getLeft(), 0, 0,
                TranslateAnimation.ABSOLUTE, yTo - getTop());
        trans.setDuration(1000);

        // add new animations to the set
        replaceAnimation.addAnimation(scale);
        replaceAnimation.addAnimation(trans);

        // start our animation
        startAnimation(replaceAnimation);
    }

Ответы [ 3 ]

15 голосов
/ 08 ноября 2011

Мое решение:

Спасибо, ребята, за вашу помощь. Но я решил проблему другим способом, динамически, без XML. Вот полный код этого метода:

public void replace(int xTo, int yTo, float xScale, float yScale) {
        // create set of animations
        replaceAnimation = new AnimationSet(false);
        // animations should be applied on the finish line
        replaceAnimation.setFillAfter(true);

        // create scale animation
        ScaleAnimation scale = new ScaleAnimation(1.0f, xScale, 1.0f, yScale);
        scale.setDuration(1000);

        // create translation animation
        TranslateAnimation trans = new TranslateAnimation(0, 0,
                TranslateAnimation.ABSOLUTE, xTo - getLeft(), 0, 0,
                TranslateAnimation.ABSOLUTE, yTo - getTop());
        trans.setDuration(1000);

        // add new animations to the set
        replaceAnimation.addAnimation(scale);
        replaceAnimation.addAnimation(trans);

        // start our animation
        startAnimation(replaceAnimation);
    }
6 голосов
/ 02 сентября 2011

Сначала вставьте объект в контейнер, который занимает весь экран.Затем измените анимацию xml следующим образом:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="50%p" android:fromYDelta="50%p" 
    android:toXDelta="0%p" android:toYDelta="0%p" 
    android:duration="1000" 
    android:fillAfter="true" />

Вы также можете проверить эту ссылку API Android http://developer.android.com/guide/topics/resources/animation-resource.html#translate-element

% p суффикс переводит элемент «в процентах относительно размера родителя».

0 голосов
/ 02 сентября 2011

Если вы хотите, чтобы он работал на всех экранах, вы не сможете жестко кодировать значения x, y.Анимации позволяют использовать проценты.Эта анимация переместит ваш вид из 0% x и y (относительно себя. Другими словами, где бы он ни находился до анимации, он начнет отсюда). Он переместится в 0% px и y (что означает 0% относительнородитель) Это должно привести вас в верхнем левом углу.В зависимости от того, насколько далеко вы хотите в углу, вы можете попробовать 5% p или 10% p, чтобы получить дополнительную маржу.

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0%" android:fromYDelta="0%" android:toXDelta="0%p"
    android:toYDelta="0%p" android:duration="1000" android:fillAfter="true" />
...