2013-03-27 61 views
12

我想在Android中创建一个带有文本和背景图像的按钮。背景图像应该每X次交叉淡入淡出。Android TransitionDrawable与多个项目

我有这个工作使用TransitionDrawable 2图像。

但我不能得到这与超过2图像工作。

我有什么:

在Java代码中创建一个按钮,并设置一个背景(这是在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

*在文档做它TransitionDrawables中指出,可以指定超过2绘项目* - 你可以提供一个链接到这个陈述? – Luksprog 2013-03-27 10:45:02

+0

http://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html#TransitionDrawable(android.graphics.drawable.Drawable []) 这表明“至少2层是必需的这个drawable to好好工作。”。 正如我在原来的帖子中所说,我也尝试了一切纯Java代码(因此有效地使用这个构造函数),但这有完全相同的问题。 – Knarf 2013-03-27 11:17:47

+1

单词的错误选择。我刚刚查看了“TransitionDrawable”的代码,它只在两个drawable之间淡出,其他每一层都被忽略。 – Luksprog 2013-03-27 11:47:51

回答

3

您可以通过使用一个处理器

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); 
+0

完美!只是一件事 - 由于弃用,考虑用ContextCompat.getDrawable替换getDrawable – 2016-08-20 23:42:58

+0

yes thanx @MohitSingh – 2016-09-03 16:46:41

6

同样的问题,根据官方的文档,TransitionDrawable能中2层仅淡入淡出,从Android官方报价参考。

LayerDrawables的一个扩展,旨在交叉衰落 所述第一和第二层之间。要启动转换,调用 startTransition(INT)。要显示仅仅是第一层,调用 resetTransition( )。

如果您没有仔细阅读它,因为它扩展了LayerDrawables,它可以有多个图层,所以可能会期望您可以从N层交叉淡入淡出。但是很明显,startTransition显示第二层,resetTransition显示第一层。

我建议你自己执行多个转换。我会做的是有2个图像和动画。您可能需要手动设置drawable,但它应该是一段非常简单的代码。

+0

实际上对我来说会发生的第一次转换正常,然后当我再次调用startTransition时,它跳转到第一个drawable并转换回第二个。 – CaseyB 2013-10-18 17:44:54

+2

你是对的!我审阅了文档并更新了答案。据记载,它只能使用2层。 – shalafi 2013-10-24 09:58:08

4
附录运行时间

可以动态改变图片

使用td.setDrawableByLayerId(td.getId(1),绘制)TransitionDrawable

TransitionDrawable transitionDrawable = (TransitionDrawable) myImage 
          .getDrawable(); 
transitionDrawable.setDrawableByLayerId(transitionDrawable.getId(1), getResources() 
          .getDrawable(R.drawable.c)); 
1

你只能最多转型两张图片与TransitionDrawable。要使用两个以上的图像工作,你可以扩展LayerDrawable和实现自己的TransitionDrawable

Here's准备执行自定义TransitionDrawable以处理两个以上的图像。

您可以看到完整的示例以及gif演示here on Github