animation-list兼容性问题

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以上无法加载出来的问题


版权声明:本文为yesemenglongyulong原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。