我正在尝试制作动画徽标。它由两个静态图像组成。
我希望达到交叉淡化效果。
我使用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下工作。
答案 0 :(得分:2)
我设法通过一个处理程序方法使转换drawable工作,该方法在从drawable1转换为drawable2之后反转方向。在我的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>
&#13;
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>
&#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;
在我的初始化代码中:
trans = (TransitionDrawable) getResources().getDrawable(R.drawable.transition);
trans.setCrossFadeEnabled(true);
backgroundimage.setImageDrawable(trans);
....
handlechange();
&#13;
处理程序代码中最重要的部分;记下全局运行的标志。我在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);
}
&#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()
停止转换。这有点像创建自己的动画,但它有效。