Как создать непрерывно работающую анимацию с возможностью рисования переходов в Android?

#android #animation #imageview #drawable #transition

#Android #Анимация #просмотр изображений #можно рисовать #переход

Вопрос:

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

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

Я сделал это с помощью 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, который работает отлично.
Самое важное, что in должно работать под Android 1.6.

Ответ №1:

Мне удалось заставить переход, который можно отрисовывать, работать с помощью метода обработчика, который меняет направление после перехода с 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);

	}  

Ответ №2:

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

Довольно простым взломом было бы добавить 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() чтобы остановить его. Это немного похоже на создание вашей собственной анимации, но это работает в крайнем случае.