【问题标题】:How to make continuously running TransitionDrawable animation in Android?如何在Android中制作连续运行的TransitionDrawable动画?
【发布时间】:2011-05-09 16:39:42
【问题描述】:

我正在尝试制作动画徽标。它由两个静态图像组成。

我想实现交叉淡入淡出效果。

我使用 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);

这是来自谷歌的完美运行的代码。 最重要的是in需要在Android 1.6下工作。

【问题讨论】:

    标签: android animation imageview drawable transition


    【解决方案1】:

    我设法通过在从 drawable1 转换到 drawable2 后反转方向的处理程序方法使转换 drawable 工作。在我的 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>

    drawables 是渐变的:

    <?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 没有设计无限循环动画功能。最简单的建议是在 View 上使用 Animation(alpha、比例、翻译等),如果可以的话,只包含一个 Drawables。

      一个相当简单的技巧是添加一个Handler 并回调到您的自定义View 并持有您的TransitionDrawable。创建View 后,可以将Handler 设置为您的转换间隔。 View 也将实现 Handler.Callback 并在其 handleMessage(Message) 方法中,它会在您的 TransitionDrawable 上调用 reverseTransition(int)

      一个粗略的例子如下:

      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() 停止它。这有点像创建自己的动画,但它可以在紧要关头工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 2022-08-14
        • 1970-01-01
        相关资源
        最近更新 更多