我有一个Android应用程序,其中循环播放了自动启动的AnimationDrawbale。使用最新的棒棒糖,它不再自动启动。
有一个简单的 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 );
知道原因吗?我应该如何管理呢?我无法解决所有 AnimationDrawable,因为其中有几个位于未知结构中。
谢谢
这是一个基于 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"/>
只能将其转换为动画可绘制对象,然后单击"开始"。
((AnimationDrawable) imageview.getDrawable()).start();
不确定为什么 5.0 上的行为发生了变化,但这不会改变较低 API 上的行为