Ответ 1
Я думаю, вы должны использовать AnimationDrawable вместо TransitionDrawable: http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
У меня есть переход, похожий на этот:
<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/divider"/>
<item android:drawable="@drawable/divider_active"/>
</transition>
и Code выглядят следующим образом:
View divider = v.findViewById(R.id.divider);
if (divider != null) {
TransitionDrawable transition = (TransitionDrawable) divider.getBackground();
transition.startTransition(2000);
}
Моя проблема в том, что я не знаю, как повторить этот переход навсегда, поэтому я могу создать пульсирующий эффект.
Edit:
Чтобы все было ясно: код запускается при создании представления (listitem), поэтому петли не являются решением.
Я думаю, вы должны использовать AnimationDrawable вместо TransitionDrawable: http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
Я знаю, что этот вопрос старый, но я хотел бы помочь другим пользователям с другим возможным решением.
AnimationDrawable
- это правильный способ, когда у вас более двух изображений, но если у вас есть только два изображения, вы можете использовать TransitionDrawable
, как вы сказали. Я покажу вам, как это сделать.
В первый раз я использую таймер в своем onCreate()
.
Timer MyTimerImage = new Timer();
Затем я создам класс MyTimerTask для запуска моего собственного кода.
public class MyTimerTask extends TimerTask {
LinearLayout myIDLinearLayout= (LinearLayout) findViewById(R.id.myIDofLinearLayout);
TransitionDrawable MyTrans = (TransitionDrawable) myIDLinearLayout.getBackground();
int i = 0;
@Override
public void run() {
runOnUiThread(new Runnable(){
@Override
public void run() {
i++;
if (i%2==0) { //
MyTrans.startTransition(myTransitionTimeinms);
}else{
MyTrans.reserveTransition(myTransitionTimeinms);
}
}});
}
}
И, наконец, я создам переменную MyTimerTask для запуска моего таймера. Этот код идет ниже создания таймера().
MyTimerTask MyTimer = new MyTimerTask();
MyTimerImage.schedule(MyTimer, myDelay, myPeriod);
В этом случае метод расписания имеет 3 параметра: первый указывает на нашу задачу TimerTask, вторая - это задержка для запуска TimerTask в мс, а третья - каждый период, который мы хотим запустить.
Не забудьте указать файл TransitionFile.xml в android:background
.
Я надеюсь, что это может помочь кому-то.
public void repeat(){
new CountDownTimer(2000, 1000){
public void onTick(long millisUntilFinished){
transition.startTransition(2000);
}
public void onFinish() {
transition.resetTransition();
repeat();
}
}.start();
}
View divider = v.findViewById(R.id.divider);
boolean loop = true;
while (loop) {
TransitionDrawable transition = (TransitionDrawable) divider.getBackground();
transition.resetTransition(); //I don't really know if this is necessary
transition.startTransition(2000);
//you'll want to stop SOME time.
if (wantToStop){
loop = false
}
}
Это может работать или не работать должным образом. Я говорю, что, поскольку во время перехода на 2 секунды цикл while будет продолжать цикл, startTransition
снова будет вызван, и снова, и снова, и снова. Вы можете использовать условие condiitonal для проверки текущего времени и проверить, не прошло ли последнее время меньше 2000.
Это может быть не самое лучшее, но цикл while - это хорошее место для начала.
Если вам нужно, я могу попытаться дать лучший пример кода, который будет лучше управлять циклом while, но сначала вы должны попробовать.