Android Notification显现中,咱们通常显现一些静态元素,即便运用自定义布局,也不破例,由于RemoteViews有着许多限制,例如运用的控件只有那些个根本控件,更新界面也有必要经过RemoteViews供给的各种set办法。但有时候,咱们便是想要去显现动画,由于动画能够供给更好的视觉作用。那么本文供给两种较简略的办法。

代码示例见:gitee.com/spectre1225…

办法一:运用ViewFlipper来实现逐帧动画的作用

榜首种办法是利用RemoteViews支持的ViewFlipper控件配合多个ImageView来循环显现,到达类似逐帧动画的作用。自定义告诉布局中的对应内容是:

<ViewFlipper
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_gravity="end|center_vertical"
    android:autoStart="true"
    android:flipInterval="90">
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim0" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim15" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim28" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim43" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim57" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim71" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim85" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/stat_sys_battery_charge_anim100" />
</ViewFlipper>

Java代码中不需要额定设置。注意这里的ViewFlipper要设置android:autoStart="true",这样动画才会自动播放起来。

  • 长处:各版本体系兼容性好,都能够运用。
  • 缺陷:ImageView过多,代码也多,修正替换麻烦。

办法二:运用AnimatedImageDrawable来显现GIF动画

Android 9.0 中引入了一个新的Drawable来显现GIF图片:AnimatedImageDrawable,对应的xml标签是<animated-image>,这样一来,咱们能够直接将一个GIF图片ic_test_gif.gif放到drawable目录中,然后新建一个ic_anim_gif.xml来引证:

<?xml version="1.0" encoding="utf-8"?>
<animated-image xmlns:android="http://schemas.android.com/apk/res/android"
    android:autoStart="true"
    android:autoMirrored="true"
    android:src="@drawable/ic_test_gif" />

在自定义告诉布局中直接编写:

<ImageView
    android:id="@+id/iv_logo"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:src="@drawable/ic_anim_gif" />

这里ImageViewsrc不直接引证gif图片是由于需要用到animated-imageautoStart特点,毕竟RemoteViews没法直接取出ImageView的drawable。

考虑到体系版本兼容,能够挑选在代码中将动画资源设置给ImageView

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    remoteViews.setImageViewResource(R.id.iv_logo, R.drawable.ic_anim_gif);
}

这种办法优缺陷如下:

  • 长处:资源少,一个gif,只要一个animated-image的xml,且替换简略。
  • 缺陷:只有Android 9.0 以上的体系能够用。