安卓过渡可绘制多个项目

2022-09-04 02:40:36

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

我使用带有2张图像的TransitionDrawable进行这项工作。

但是我无法让它与超过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中,我在磁贴中定义.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> 

最后是过渡.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个以上的可绘制对象,但我无法使其正常工作。

我也在没有任何XML的情况下尝试了这个,但在纯JAVA中,但这给出了完全相同的问题:-(


答案 1

您可以使用处理程序来执行此操作

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

根据官方文档,TransitionDrawable只能在2层之间交叉淡入淡出,引用自官方的Android参考。

LayerDrawables 的扩展,旨在在第一层和第二层之间交叉淡入淡出。要开始转换,请调用 startTransition(int)。要仅显示第一层,请调用 resetTransition()。

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

我建议您为多个转换进行自己的实现。我要做的是拥有2个图像并将它们动画化。您可能需要手动设置可绘制对象,但它应该是一段非常简单的代码。


推荐