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