如何在Android中连续运行TransitionDrawable动画?

时间:2011-05-09 16:39:42

标签: android animation imageview drawable transition

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

我希望达到交叉淡化效果。

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

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

2 个答案:

答案 0 :(得分:2)

我设法通过一个处理程序方法使转换drawable工作,该方法在从drawable1转换为drawable2之后反转方向。在我的XML中:

&#13;
&#13;
<?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>
&#13;
&#13;
&#13;

drawables是渐变:

&#13;
&#13;
<?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>
&#13;
<?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>
&#13;
&#13;
&#13;

在我的初始化代码中:

&#13;
&#13;
trans = (TransitionDrawable) getResources().getDrawable(R.drawable.transition);
		trans.setCrossFadeEnabled(true);
		backgroundimage.setImageDrawable(trans);

....

handlechange();
&#13;
&#13;
&#13;

处理程序代码中最重要的部分;记下全局运行的标志。我在Gingerbread和Kitkat上运行了这个;

&#13;
&#13;
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);

	}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

没有真正的内置方法可以做到这一点。 TransitionDrawable未设计具有无限循环动画功能。最简单的建议是在Animation上使用View(字母,缩放,翻译等),如果可以的话,只包含Drawable中的一个。

一个相当容易的黑客方法是添加Handler和回调到您View的自定义TransitionDrawable。创建View后,Handler可以设置为您的转换间隔。 View也会实施Handler.Callback,在其handleMessage(Message)方法中,它会在reverseTransition(int)上调用TransitionDrawable

一个粗略的例子如下:

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()停止转换。这有点像创建自己的动画,但它有效。