Android-анимация: одновременная и последовательная - PullRequest
1 голос
/ 02 августа 2011

Я использую два изображения (img_heart_1 и img_heart_2).У меня есть две анимации, одна трансляционная и другая с масштабированием text_anim.xml: animi(Animation), bounce_up.xml :bounce_up_anim(Animation)

  • Последовательная: одна анимация за другой.
  • одновременно: обе анимации изображения одновременно.

  • Эксклюзивно: две анимации (по одной для каждого изображения)

  • Включено: только одна анимация (AnimationUtils.loadAnimation(this, R.anim.Same)) используется для обеих анимаций изображения.

Результат - последовательные и разные анимации, ожидаемый результат.но если я вырежу secAnim.execute(); из firstAnimationAsync и введу onResume, обе анимации будут запускаться одновременно, только один раз

Если я сохраню secAnim.execute() в onResume(), и вместо img_heart_2.startAnimation(animi);img_heart_2.startAnimation(bounce_up_anim); он будет запущен один раз, одновременно.

Если я положу secAnim.execute() в onPostExecute() из firstAnimationAsync и оставлю startAnimation(animi) для обоих изображений, теперь первая анимация будет запускаться в первый раз, затем во второй раз - обе анимации.

Почему это так?

Кроме того, если два изображения происходят одновременно, второе выглядит немного прижатым (сжато вертикально вниз).Я также поставил da=null, (теперь прокомментировал), разве это не должно аннулировать эту анимацию?

Я также хочу, чтобы моя трансляционная анимация осталась без конца или стала невидимой.

код: text_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    >
        <translate
            android:fromXDelta="0"
            android:toXDelta="50"
            android:fromYDelta="0"
            android:toYDelta="100"
            android:duration="3000"
            android:fillAfter="false"/>


</set>

код: bounce_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
        <scale 
            android:fromXScale="1.0"
            android:toXScale="2.0"
            android:fromYScale="1.0"
            android:toYScale="3.0"
            android:pivotX="50%"
            android:pivotY="0%"
            android:duration="3000"/>   
</set>

код: anidro.java

package my.trials.anidro;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class anidro extends Activity {
    ImageView img_heart_1,img_heart_2, img_heart_3;
    Animation animi, bounce_up_anim;
    Bitmap b1,b2;
    firstAnimationAsync da;
    secondAnimAsync secAnim;
    @Override
    public void onPause(){
        super.onPause();
    }
    @Override
    public void onResume(){
        super.onResume();
        InitializeLayouts();
        **da.execute();**

    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    private void InitializeLayouts() {  
        img_heart_1=(ImageView)findViewById(R.id.lay_main_heartImg);
        img_heart_2 = (ImageView)findViewById(R.id.lay_main_heart2Img);
        **bounce_up_anim**=AnimationUtils.loadAnimation(this, R.anim.bounce_up);
        **animi** = AnimationUtils.loadAnimation(this, R.anim.text_anim);
        b1 = BitmapFactory.decodeResource(getResources(),R.drawable.anidro_heart2); 
        b2=BitmapFactory.decodeResource(getResources(), R.drawable.anidro_heart3);
        da= new firstAnimationAsync();
        secAnim = new secondAnimAsync();

        //img_heart_12=(ImageView)findViewById(R.id.lay_main_koalaImg);
    }
    private class firstAnimationAsync extends AsyncTask<Void, Void, Void>{
        protected void onPreExecute(){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            img_heart_1.setImageBitmap(b1);
            img_heart_1.setVisibility(View.VISIBLE);
            img_heart_1.startAnimation(**animi**);
            //img_heart_1.setVisibility(View.INVISIBLE);
        }
        @Override
        protected Void doInBackground(Void...params){
            try{

                Thread.sleep(1800);
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
            return null;
        }
        protected void onPostExecute(Void v){
                    **secAnim.execute();**
            //da=null;
            return;
        }
    }
    private class secondAnimAsync extends AsyncTask<Void, Void, Void>{
        protected void onPreExecute(){
            img_heart_2.setImageBitmap(b2);
            //da=null;
            img_heart_2.setVisibility(View.VISIBLE);
            //img_heart_1.setVisibility(View.INVISIBLE);
            img_heart_2.startAnimation(**bounce_up_anim**);
        }

        protected Void doInBackground(Void...params){
            try{
                Thread.sleep(5000);
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
            return null;
        }
        protected void onPostExecute(Void v){
            //secAnim = null;
            return;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 12 апреля 2012

Я знаю, что это старый вопрос, но для дальнейшего использования вы можете использовать AnimationSet.Builder

Объект Builder - это служебный класс, облегчающий добавление анимаций в AnimatorSet вместе с взаимосвязями между различными анимациями. Цель методов Builder вместе с методом play () класса AnimatorSet состоит в том, чтобы сделать возможным естественным образом выразить отношения зависимостей анимаций. Разработчики также могут использовать методы playTogether () и playSequentially (), если они удовлетворяют потребности, но в некоторых ситуациях может быть проще выразить AnimatorSet анимаций в парах.

Например, это устанавливает AnimatorSet для одновременного воспроизведения anim1 и anim2, anim3 для воспроизведения, когда anim2 заканчивается, и anim4 для воспроизведения, когда anim3 заканчивается:

AnimatorSet s = new AnimatorSet();
s.play(anim1).with(anim2);
s.play(anim2).before(anim3);
s.play(anim4).after(anim3);
0 голосов
/ 10 августа 2011

Вы действительно не должны использовать ASyncTask для графических вещей.Никто не может точно предсказать, когда задачи будут выполняться в системе, поэтому это очень плохая идея.

Почему бы вместо этого не использовать Animation Listener ?Вам просто нужно создать свою первую анимацию и добавить новый слушатель анимации, который запустит вашу вторую анимацию в начале или в конце первой.

Для отмены анимации просто позвоните

img_heart.clearAnimation();

И чтобы флешка закончилась, я не уверен, что вы хотите, но, вероятно, вы хотите, чтобы ваше изображение оставалось там, где оно находится в конце анимации, поэтому вам нужно установить этот атрибут в объявлении анимации.:

android:fillAfter="true"

android:fillBefore="false"
android:fillEnabled="true"

Только fillAfter представляется обязательным, поэтому попробуйте сначала, но если это не сработает, добавьте следующие две строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...