Android TransitionDrawable包含多个项目

时间:2013-03-27 10:38:59

标签: android

我想在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中,但这给出了完全相同的问题: - (

5 个答案:

答案 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

image准备好实施自定义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);