AnimationDrawable不会在Lollipop上自动启动

时间:2014-12-09 15:03:09

标签: android animation

我有一个Android应用程序,其中循环AnimationDrawbale自动启动。使用最新的Lollipop,它不再自动启动。

有一个简单的ImageView,其中src解决了下一个可绘制的xml:

<?xml version="1.0" encoding="utf-8"?>
<level-list
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="0" android:drawable="@drawable/ic_weather_sun" />
    <item android:maxLevel="1" android:drawable="@drawable/ic_weather_cloudsun" />
    <item android:maxLevel="2" android:drawable="@drawable/ic_weather_cloud" />
    <item android:maxLevel="3" android:drawable="@drawable/ic_weather_rain" />
    <item android:maxLevel="4" android:drawable="@drawable/ic_weather_rainstorm" />
</level-list>

级别列表的每个项目是另一个可绘制的xml。 其中一些是动画列表(Animationdrawable),另一些是层列表,其中一个或多个层由动画列表组成。这是一个例子:

<layer-list
   xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <animation-list android:oneshot="false">
            <item android:drawable="@drawable/ic_weather_layer_rain1" android:duration="100" />
            <item android:drawable="@drawable/ic_weather_layer_rain2" android:duration="100" />
            <item android:drawable="@drawable/ic_weather_layer_rain3" android:duration="100" />
            <item android:drawable="@drawable/ic_weather_layer_rain4" android:duration="100" />
        </animation-list>
    </item>
    <item android:drawable="@drawable/ic_weather_layer_cloudcolor1" />
    <item android:drawable="@drawable/ic_weather_layer_cloud2" />
    <item android:drawable="@drawable/ic_weather_layer_cloud1" />
</layer-list>

ImageView级别在活动开始时设置为不可见,只需以这种方式选择。

    final ImageView meteo = (ImageView)findViewById(R.id.image_meteo);
    meteo.setVisibility(View.VISIBLE);
    meteo.setImageLevel( weatherIdx );

有什么想法吗?我应该如何管理呢? 我不能解决所有的AnimationDrawables,因为它们中有几个是未知的结构。

由于

2 个答案:

答案 0 :(得分:2)

以下是基于AppCompatImageView的课程,该课程将自动启动源代码和背景AnimationDrawables

public class AnimationImageView extends AppCompatImageView
{
    public AnimationImageView(Context context)
    {
        super(context);
    }

    public AnimationImageView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public AnimationImageView(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setBackgroundResource(@DrawableRes int resId)
    {
        super.setBackgroundResource(resId);
        startAnimation(getBackground());
    }

    @Override
    public void setBackgroundDrawable(Drawable background)
    {
        super.setBackgroundDrawable(background);
        startAnimation(background);
    }

    @Override
    public void setImageResource(@DrawableRes int resId)
    {
        super.setImageResource(resId);
        startAnimation(getDrawable());
    }

    @Override
    public void setImageDrawable(@Nullable Drawable drawable)
    {
        super.setImageDrawable(drawable);
        startAnimation(drawable);
    }

    protected void startAnimation(Drawable drawable)
    {
        if (drawable instanceof AnimationDrawable)
        {
            ((AnimationDrawable) drawable).start();
        }
    }
}

您可以在布局中使用它,如下所示(更改com.sample.ui.views以匹配您将放置上述类的包):

<com.sample.ui.views.AnimationImageView
    android:id="@+id/iv_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_src_animation"
    android:background="@drawable/my_bg_animation"/>

答案 1 :(得分:1)

应该能够将其转换为可绘制的动画,然后单击“开始”。

((AnimationDrawable) imageview.getDrawable()).start();

不确定为什么5.0上的行为发生了变化,但这并没有改变较低API的行为