如何使一个过渡动画永久重复?

15

我有一个如下的过渡效果:

<?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);
}
我的问题是,我不知道如何无限重复这个过渡,以便我可以创建一个脉动效果。
编辑:
为了让事情更清楚: 该代码在创建视图(列表项)时执行,因此循环不是解决方案。
4个回答

7
我知道这个问题比较老,但我想帮助其他用户提供其他可能的解决方案。
当你有超过两张图片时,使用AnimationDrawable是正确的方式,但当你只有两张图片时,你也可以像你所说的那样使用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变量来运行我的计时器。此代码位于Timer()创建之下。

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

在这种情况下,schedule方法有三个参数:第一个参数表示我们的TimerTask任务,第二个参数是以毫秒为单位运行TimerTask的延迟时间,第三个参数表示我们想要运行代码的每个时间段。
别忘了在android:background中包含你的TransitionFile.xml文件。
希望能对某些人有所帮助。

这个被称为只有一次。 - Qadir Hussain
其实它是有效的。我在MyTimerTask、MyTimerImage和MyTimer这几个相同的名称上感到困惑。 - Qadir Hussain

3
public void repeat(){   
    new CountDownTimer(2000, 1000){

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

        public void onFinish() {
            transition.resetTransition();
            repeat();
        }
    }.start();
}

请在您的代码片段周围添加一些上下文,否则用户可能难以理解您的方法。 - RBT

1

8
AnimationDrawable不像TransitionDrawable那样在其项之间进行动画,有什么解决方法吗? - Heysem Katibi

-4

编辑:这是一个糟糕的答案,但我还是保留它,以防讨论对任何人有帮助。我可能仍然应该被踩lol

      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循环,但您应该先尝试一下。


1
循环不起作用,因为它会阻塞。这个分隔符是列表视图中列表项的一部分。我在创建视图时执行此代码。 - CPlusPlus
尝试使用线程?这可能有点复杂,因为您无法从工作线程更新UI线程,但是这可能是可行的。您还需要使用Handler进行通信。我想我真的不知道接下来该去哪里。 - Reed
这真的太复杂了,我想。我考虑过动画,但在网上找不到可比较的东西 :/ - CPlusPlus
我理解并同意。祝你好运,我猜。我不知道如何使用动画或TransitionDrawable,否则我可能会更有帮助。抱歉。 :) - Reed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接