Синхронные переводы на Android - PullRequest
7 голосов
/ 16 ноября 2010

Я пытаюсь сделать несколько переводов одновременно на Android.

У меня есть 2 или более кнопок на макете (все одинакового размера), и когда я нажимаю одну, я хочу, чтобы другие вышли изэкран.

Я сделал тестовое приложение, чтобы попытаться реализовать это поведение.

На нем я установил слушателя на нажатие одной кнопки для проверки, что-то вроде:

button.setOnClickListener(new View.OnClickListener() {

    public void onClick(View view) {
        Button toMove = (Button) findViewById(R.id.button_test2);
        Button toMove2 = (Button) findViewById(R.id.button_test3);

        AnimationSet set = new AnimationSet(true);

        TranslateAnimation anim = new TranslateAnimation(0, -toMove
          .getWidth(), 0, 0);
        anim.setFillAfter(true);
        anim.setDuration(1000);

        toMove.setAnimation(anim);
        toMove2.setAnimation(anim);

        set.addAnimation(anim);

        set.startNow();
    }

Вид:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button android:id="@+id/button_test" android:layout_width="200px"
        android:layout_height="50px" android:text="@string/hello" />

    <Button android:id="@+id/button_test2" android:layout_width="200px"
        android:layout_height="50px" android:text="@string/hello"/>

    <Button android:id="@+id/button_test3" android:layout_width="200px"
        android:layout_height="50px" android:text="@string/hello"/>

</LinearLayout>

Дело в том, чтодве кнопки запускают анимацию, одну за другой.Я читал, что это из-за getDelayForView(), который возвращает разные задержки каждого.Есть ли способ одновременно переместить 2 или более кнопок?

Google не очень помог: - \

1 Ответ

11 голосов
/ 23 сентября 2011

Проблема:

Похоже, что setAnimation будет запускать анимацию автоматически и, вероятно, асинхронно.Однако может быть блокировка при настройке анимации для второго вида.Должен быть диспетчер, потому что установка анимации для кнопок в другом порядке не влияет на тот факт, что нижняя кнопка быстрее.

Решение состоит в том, чтобы предотвратить эту гипотетическую блокировку путем создания двух отдельных анимаций.

Код:

public void onClick(View view) {
    Button toMove = (Button) findViewById(R.id.button_test2);
    Button toMove2 = (Button) findViewById(R.id.button_test3);

    TranslateAnimation anim = new TranslateAnimation(0, -toMove
            .getWidth(), 0, 0);
    anim.setFillAfter(true);
    anim.setDuration(1000);

    TranslateAnimation anim2 = new TranslateAnimation(0, -toMove
            .getWidth(), 0, 0);
    anim2.setFillAfter(true);
    anim2.setDuration(1000);

    //THERE IS ONE MORE TRICK

    toMove.setAnimation(anim);
    toMove2.setAnimation(anim2);
}

Примечание:

В //THERE IS ONE MORE TRICK можно добавить следующий код, чтобы обеспечить их совместное перемещение. Все еще должно быть отставание в 1 миллисекунду или около того.

long time =AnimationUtils.currentAnimationTimeMillis();

//This invalidate is needed in new Android versions at least in order for the view to be refreshed.
toMove.invalidate(); 
toMove2.invalidate();
anim.setStartTime(time);
anim2.setStartTime(time);
...