【问题标题】:How can I repeat a transition forever?我怎样才能永远重复一个过渡?
【发布时间】:2011-12-20 21:47:59
【问题描述】:

我的过渡看起来像这样:

<?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);
}

我的问题是,我不知道如何永远重复这个过渡,所以我可以创建一个脉冲效果。

编辑:

为了清楚起见:代码在创建视图(listitem)时被执行,所以循环不是解决方案。

【问题讨论】:

    标签: android transition


    【解决方案1】:

    我知道这个问题很老,但我想帮助其他用户提供其他可能的解决方案。

    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 方法有 3 个参数:第一个表示我们的 TimerTask 任务,第二个是运行 TimerTask 的延迟,以毫秒为单位,第三个表示我们要运行代码的每个周期。

    不要忘记将您的 TransitionFile.xml 文件包含在您的 android:background 中。

    希望对大家有所帮助。

    【讨论】:

      【解决方案2】:
      public void repeat(){   
          new CountDownTimer(2000, 1000){
      
               public void onTick(long millisUntilFinished){
                   transition.startTransition(2000);
              }
      
              public void onFinish() {
                  transition.resetTransition();
                  repeat();
              }
          }.start();
      }
      

      【讨论】:

      • 请在您的代码 sn-p 周围添加一些上下文,否则用户可能难以理解您的方法。
      【解决方案3】:

      我认为你应该使用 AnimationDrawable 而不是 TransitionDrawable:http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

      【讨论】:

      • AnimationDrawable 与 TransitionDrawable 不同,它不会在其项目之间设置动画,有什么想法可以解决这个问题吗?
      【解决方案4】:

      编辑:这是一个糟糕的答案,但我会留下它,以防讨论对任何人都有帮助。我可能仍然应该投反对票,哈哈

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

      【讨论】:

      • 循环不起作用,因为它会阻塞。此分隔符是列表视图中列表项的一部分。我在创建视图时执行此代码。
      • 尝试使用线程?这可能有点复杂,因为您无法从工作线程更新 UI 线程,但它可能是可行的。您还必须使用 Handler 进行通信。我想我真的不知道你下一步该去哪里。
      • 我认为这真的很复杂。我想到了动画,但我在网络上找不到可比的东西:/
      • 我理解并同意。祝你好运,我猜。我不知道如何使用动画或TransitionDrawable,否则我可能会提供更多帮助。对不起。 :)
      猜你喜欢
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多