1、ImageView通过animation-list设置逐帧动画
问题:Android 6.0 animation-list 失效问题
在drawable文件下创建文件animation_loading.xml
animation_loading.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"
android:variablePadding="true">
<item
android:drawable="@mipmap/loading_c0"
android:duration="100"
android:gravity="center"/>
<item
android:drawable="@mipmap/loading_c1"
android:duration="100"
android:gravity="center"/>
<item
android:drawable="@mipmap/loading_c2"
android:duration="100"
android:gravity="center"/>
<item
android:drawable="@mipmap/loading_c3"
android:duration="100"
android:gravity="center"/>
<item
android:drawable="@mipmap/loading_c4"
android:duration="100"
android:gravity="center"/>
<item
android:drawable="@mipmap/loading_c5"
android:duration="100"
android:gravity="center"/>
</animation-list>
只是简单的添加了图片并标注了执行时间,没有额外的功能
使用的ImageView设置动画
<ImageView
android:id="@+id/iv_loading"
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"
android:src="@drawable/animation_loading"
android:visibility="visible" />
设置好后,再Android4.4(API 19)可以使用,但是在Android6.0(API 23)中不可以使用。
通过AnimationDrawable的文档可以得出
创建逐帧动画的最简单方法是在XML文件中定义动画,放置在res/drawable/文件夹中,并将其设置为View对象的背景。然后,调用start()运行动画。
在类中中调用start()方法
ImageView mIvLoading = findViewById(R.id.iv_splash_loading); ((Animatable)mIvLoading.getDrawable()).start();
结果:完美运行
2、progressbar通过animation-list设置逐帧动画
问题:progressbar设置帧动画部分手机显示多了一部分
使用progressbar设置动画:
<ProgressBar
android:id="@+id/stProgress"
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_60"
android:layout_gravity="center_horizontal"
android:indeterminateBehavior="repeat"
android:indeterminateDrawable="@drawable/animation_loading" />
帧动画图片显示了一个半
解决方案:
drawable中新建animation_loading_clip.xml,代码如下:添加了clip属性
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:duration="100">
<clip
android:clipOrientation="horizontal"
android:drawable="@mipmap/loading_c0"
android:gravity="left" />
</item>
<item android:duration="100">
<clip
android:clipOrientation="horizontal"
android:drawable="@mipmap/loading_c1"
android:gravity="left" />
</item>
<item android:duration="100">
<clip
android:clipOrientation="horizontal"
android:drawable="@mipmap/loading_c2"
android:gravity="left" />
</item>
<item android:duration="100">
<clip
android:clipOrientation="horizontal"
android:drawable="@mipmap/loading_c3"
android:gravity="left" />
</item>
<item android:duration="100">
<clip
android:clipOrientation="horizontal"
android:drawable="@mipmap/loading_c4"
android:gravity="left" />
</item>
<item android:duration="100">
<clip
android:clipOrientation="horizontal"
android:drawable="@mipmap/loading_c5"
android:gravity="left" />
</item>
</animation-list>
使用progressbar设置动画:
<ProgressBar
android:id="@+id/stProgress"
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_60"
android:layout_gravity="center_horizontal"
android:indeterminateBehavior="repeat"
android:indeterminateDrawable="@drawable/animation_loading_clip" />
这样6.0以下得手机完美运行,但是6.0以上的手机不显示,6.0以上不支持clip动画
解决方案:
类中控制,添加兼容性处理:
if (android.os.Build.VERSION.SDK_INT > 22) {
//android 6.0以上clip的动画加载不出来,改为普通动画帧
// !!!注意:代码中使用animation_loading布局动画 布局文件中使用animation_loading_clip
final Drawable drawable = getContext().getApplicationContext().getResources().getDrawable(R.drawable.animation_loading);
stProgress.setIndeterminateDrawable(drawable);
}
解决了6.0以上无法加载出来的问题