我想在Android中使用文本和背景图片创建一个Button。背景图像应该每X次交叉渐变。
我使用带有2个图像的TransitionDrawable工作。
但我无法使用2张以上的图像。
我有什么:
在Java代码中,我创建一个Button并设置一个背景(这是一个在XML中定义的TransitionDrawable)。我开始过渡。
final Button b = new Button(getApplicationContext());
b.setTextColor(getResources().getColor(R.color.white));
b.setText("Some text");
b.setBackgroundDrawable(getResources().getDrawable(R.drawable.tile));
StateListDrawable background = (StateListDrawable) b.getBackground();
TransitionDrawable td = (TransitionDrawable) background.getCurrent();
td.startTransition(2000);
在XML中我在tile.xml中定义
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape>
<solid
android:color="#449def" />
</shape>
</item>
<item android:drawable="@drawable/transition">
<shape>
<solid
android:color="#0000ff" />
</shape>
</item>
</selector>
最后是transition.xml
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/desert"/>
<item android:drawable="@drawable/hydrangeas" />
<item android:drawable="@drawable/jellyfish" />
</transition>
现在效果是,当我启动应用程序时,会显示沙漠图像。这个图像交叉渐变到绣球花图像应该。但水母图像从未显示过。
在TransitionDrawables的文档中,声明您可以指定2个以上的drawable,但我无法使其工作。
我在没有任何XML的情况下尝试了这个,但在纯JAVA中,但这给出了完全相同的问题: - (
答案 0 :(得分:6)
根据官方文档,TransitionDrawable只能在2层之间交叉淡入淡出,引用官方的android引用。
LayerDrawables的扩展,旨在交叉淡入淡出 第一层和第二层。要开始转换,请致电 startTransition(INT)。要仅显示第一层,请致电 resetTransition()。
如果你没有仔细阅读,因为它扩展了LayerDrawables,它可以有多个层,你可以期望你可以从N层交叉淡入淡出。但很明显,startTransition显示第二层,resetTransition显示第一层。
我建议您为多个转换执行自己的实现。我要做的是拥有2张图像并制作动画。您可能需要手动设置drawable,但它应该是一段非常简单的代码。
答案 1 :(得分:6)
您可以使用处理程序
来完成此操作mAnimateImage is your button
int DrawableImage[] = {R.drawable.back_red, R.drawable.back_green, R.drawable.back_purple};
final Handler handler = new Handler();
final int[] i = {0};
final int[] j = {1};
handler.postDelayed(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Resources res = getApplicationContext().getResources();
TransitionDrawable out = new TransitionDrawable(new Drawable[]{res.getDrawable(DrawableImage[i[0]]), res.getDrawable(DrawableImage[j[0]])});
out.setCrossFadeEnabled(true);
mAnimateImage.setBackgroundDrawable(out);
out.startTransition(4000);
i[0]++;
j[0]++;
if (j[0] == DrawableImage.length) {
j[0] = 0;
}
if (i[0] == DrawableImage.length) {
i[0] = 0;
}
handler.postDelayed(this, 8000);
}
});
}
}, 0);
答案 2 :(得分:4)
在附录操作时间你可以动态改变图片
在 TransitionDrawable
上使用 td.setDrawableByLayerId(td.getId(1),drawable)TransitionDrawable transitionDrawable = (TransitionDrawable) myImage
.getDrawable();
transitionDrawable.setDrawableByLayerId(transitionDrawable.getId(1), getResources()
.getDrawable(R.drawable.c));
答案 3 :(得分:1)
您只能使用TransitionDrawable
转换最多两张图片。要处理两个以上的图像,您可以扩展LayerDrawable并实现自己的TransitionDrawable
。
准备好实施自定义TransitionDrawable
以处理两个以上的图片。
您可以看到完整的示例以及gif演示Here's。
答案 4 :(得分:-1)
您只需在每次迭代中创建一个新的TransitionDrawable。
这将逐步增加您添加的所有图像的索引,您可以拥有任意数量的图像...
private Handler handler = new Handler();
private void startImageCrossfading(@IdRes int imageViewResId, @DrawableRes int... drawableIds) {
Drawable[] bitmapDrawables = new Drawable[drawableIds.length];
for (int i = 0; i < drawableIds.length; i++) {
// if you are using Vectors cross fade won't work unless you do this! - See my answer at https://stackoverflow.com/a/54583929/114549
// bitmapDrawables[i] = getBitmapDrawableFromVectorDrawable(this, drawableIds[i]);
bitmapDrawables[i] = ContextCompat.getDrawable(this, drawableIds[i]);
}
final ImageView imageView = findViewById(imageViewResId);
handler.postDelayed(new Runnable() {
int index = 0;
@Override
public void run() {
TransitionDrawable td = new TransitionDrawable(new Drawable[]{
bitmapDrawables[index % bitmapDrawables.length],
bitmapDrawables[++index % bitmapDrawables.length]
});
td.setCrossFadeEnabled(true);
imageView.setImageDrawable(td);
td.startTransition(500); // transitionDurationMillis
handler.postDelayed(this, 3000);
}
}, 3000);
}
暂停时,您应该清理处理程序
handler.removeCallbacksAndMessages(null);