Как сделать так, чтобы анимация TransitionDrawable работала в Android? - PullRequest
5 голосов
/ 09 мая 2011

Я пытаюсь сделать анимированный логотип.Он состоит из двух статических изображений.

Я бы хотел добиться эффекта перекрестного замирания.

Я сделал это с использованием TransitionDrawable, установил crossFadeEnabled и все выглядит хорошо.

Дело в том, что мне нужно бегать по кругу.Как это может быть достигнуто?

<transition xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/image_expand">
  <item android:drawable="@drawable/image_collapse">
</transition>

Resources res = mContext.getResources();
TransitionDrawable transition = (TransitionDrawable) res.getDrawable(R.drawable.expand_collapse);
ImageView image = (ImageView) findViewById(R.id.toggle_image);
image.setImageDrawable(transition);

Это код от Google, который работает отлично.Главное, чтобы он работал под Android 1.6.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2014

Мне удалось заставить нарисованный переход работать, используя метод обработчика, который меняет направление после перехода от drawable1 к drawable2. В моем XML:

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android"  >

    <item android:drawable="@drawable/background_animation1"/>
    <item android:drawable="@drawable/background_animation2"/>

</transition>

Графики для рисования:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
     <corners android:topLeftRadius = "10dp" android:topRightRadius="10dp" android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp"/>
    
    <gradient
        android:startColor="#d200ff" 
        android:centerColor="#4e00ff"
        android:endColor="#006cff"/>

</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <size android:width="900dp" android:height="500dp"/>
    <corners android:topLeftRadius = "10dp" android:topRightRadius="10dp" android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp"/>
    <gradient
        android:startColor="#006cff" 
        android:centerColor="#ff6600"
        android:endColor="#d200ff"/>

</shape>

В моем коде инициализации:

trans = (TransitionDrawable) getResources().getDrawable(R.drawable.transition);
		trans.setCrossFadeEnabled(true);
		backgroundimage.setImageDrawable(trans);

....

handlechange();

И самый важный бит в коде обработчика; обратите внимание на флаг, который работает во всем мире. У меня это работает на Gingerbread и Kitkat;

void handlechange1()
	{
		Handler hand = new Handler();
		hand.postDelayed(new Runnable()
		{
			@Override
			public void run()
			{
				change();
			}
			private void change()
			{
				if (flag)
				{
					trans.startTransition(8000);
					flag = false;
				} else
				{
					trans.reverseTransition(8000);
					flag = true;
				}
				handlechange1();
			}
		}, 8000);

	}
1 голос
/ 02 марта 2012

Нет действительно встроенного способа сделать это. TransitionDrawable не имеет функции анимации с бесконечным циклом. Самой простой рекомендацией будет использование Animation (альфа, масштабирование, перевод и т. Д.) На View, содержащем только один из ваших Drawable s, если вы можете.

Довольно простым взломом было бы добавить Handler и обратный вызов к вашему пользовательскому View, удерживающему ваш TransitionDrawable. Когда View создан, для Handler можно установить интервал перехода. View также реализует Handler.Callback, а внутри своего метода handleMessage(Message) он вызовет reverseTransition(int) для вашего TransitionDrawable.

Грубый пример ниже:

public class myView extends View implements Handler.Callback {

    private Handler mHandler = new Handler(this);

    private int mDelay = 1000; // Delay in milliseconds.

    private Runnable mEvent = new Runnable() {
        public void run() {
            mHandler.removeCallbacks(mEvent);
            mHandler.postDelayed(mEvent, mDelay);
            Message message = mHandler.obtainMessage();
            mHandler.sendMessage(message);
        }
    };

    public View(Context context) {
        super(context);
        // Set your background TransitionDrawable.
        setBackgroundDrawable(...);
    }

    public handleMessage(Message message) {
        TransitionDrawable drawable = (TransitionDrawable) getBackgroundDrawable();
        drawable.reverseTransition(mDelay);
    }

    public void start() {
        mHandler.post(mEvent);
    }

    public void stop() {
        mHandler.removeCallbacks(mEvent);
    }

}

Позвоните start(), чтобы начать непрерывный переход, stop(), чтобы остановить его. Это немного похоже на создание собственной анимации, но работает в крайнем случае.

...