Как я могу повторить переход навсегда? - PullRequest
14 голосов
/ 21 декабря 2011

У меня есть переход, похожий на этот:

<?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>

и код выглядит следующим образом:

View divider = v.findViewById(R.id.divider);
if (divider != null) {
  TransitionDrawable transition = (TransitionDrawable) divider.getBackground();
  transition.startTransition(2000);
}

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

Edit:

Чтобы прояснить ситуацию: код выполняется при создании представления (listitem), поэтому циклы не являются решением.

Ответы [ 4 ]

5 голосов
/ 10 февраля 2015

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

AnimationDrawable является правильным способом, когда у вас есть более 2 изображений, но когда у вас есть только два изображения, вы также можете использовать TransitionDrawable, как вы сказали. Я покажу вам, как это сделать.

В первый раз я буду использовать таймер в моем onCreate().

Timer MyTimerImage = new Timer();

Затем я создам класс MyTimerTask (в родительском классе Activity) для запуска собственного кода.

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.reverseTransition(myTransitionTimeinms);
                }

            }});
    }

}

И, наконец, я создам переменную MyTimerTask для запуска моего таймера. Этот код идет ниже создания таймера ().

MyTimerTask MyTimer = new MyTimerTask();
MyTimerImage.schedule(MyTimer, myDelay, myPeriod);

В этом случае метод расписания имеет 3 параметра: первый указывает нашу задачу TimerTask, второй - задержку запуска TimerTask в мс, а третий - каждый период, когда мы хотим запустить код.

Не забудьте включить файл TransitionFile.xml в android:background.

Я надеюсь, что это может кому-то помочь.

2 голосов
/ 07 июня 2016
public void repeat(){   
    new CountDownTimer(2000, 1000){

         public void onTick(long millisUntilFinished){
             transition.startTransition(2000);
        }

        public void onFinish() {
            transition.resetTransition();
            repeat();
        }
    }.start();
}
1 голос
/ 27 июня 2012

Я думаю, что вы должны использовать AnimationDrawable вместо TransitionDrawable: http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

0 голосов
/ 21 декабря 2011
  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 будет вызываться снова, и снова, и снова, и снова. Вы можете использовать условное заявление, чтобы проверить текущее время и убедиться, что время последнего запуска меньше 2000.

Возможно, это не лучший вариант, но цикл while - хорошее место для начала.

Если вам нужно, я мог бы попытаться привести лучший пример кода, который будет лучше управлять циклом while, но вам следует сначала попробовать.

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