FrameAnimation 动画概述
FrameAnimation 又叫 DrawableAnimation 中文名叫 逐帧动画(Frame by Frame)。他能实现像幻灯片,放电影一样复杂的动画效果,灵活性非常强,几乎可以实现你想要的效果。
FrameAnimation 实现
逐帧动画有两种实现方式 xml 和java 这里推荐使用 xml ,使用起来方便。
1 xml 实现方式:
对于资源文件 一般都会放在res/目录下,逐帧动画需要Drawable 资源,所以我们自定义的xml 应该放在Drawable 目录下,示例如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
animation-list 是根目录,包含一个或者多个item 。包含属性 oneshot ,true 代表只播放一次,false 代表可以循环播放。
示例:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"> <!--这里循环播放-->
<item android:drawable="@mipmap/ic_volume_1" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_2" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_3" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_4" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_5" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_6" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_7" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_8" android:duration="350" />
</animation-list>
使用:
AnimationDrawable frameAnim = (AnimationDrawable)getResources().getDrawable(R.drawable.image_animation);
imageView.setBackgroundDrawable(frameAnim);
//frameAnim.setOneShot(true);
frameAnim.start();
这样动画 就能展示出来了。
2 java 实现方式(不推荐)
java 通过 AnimationDrawable addFrame 方法把资源一个一个加进去:
frameAnim =new AnimationDrawable();
// 为AnimationDrawable添加动画帧
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_1), 400);
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_2), 300);
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_3), 200);
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_4), 400);
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_5), 300);
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_6), 200);
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_7), 100);
frameAnim.addFrame(getResources().getDrawable(R.mipmap.ic_volume_8), 400);
frameAnim.setOneShot(false);
frameAnim.start();
这种方式并不推荐使用。
FrameAnimation 示例
演示一个录音的动画效果,静态图如下所示:
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="186dp"
android:layout_height="186dp"
android:layout_gravity="center"
android:background="@drawable/bg_voice_popup"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/rc_audio_state_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginBottom="11dp"
android:layout_marginLeft="41dp"
android:layout_marginRight="41dp"
android:layout_marginTop="20dp" />
<TextView
android:id="@+id/rc_audio_timer"
android:layout_width="105dp"
android:layout_height="105dp"
android:layout_centerHorizontal="true"
android:layout_marginBottom="11dp"
android:layout_marginLeft="41dp"
android:layout_marginRight="41dp"
android:layout_marginTop="20dp"
android:gravity="center"
android:textColor="@android:color/white"
android:textSize="70sp"
android:text="10"
android:visibility="invisible" />
<TextView
android:id="@+id/rc_audio_state_text"
android:layout_width="160dp"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:layout_gravity="center"
android:layout_marginBottom="11dp"
android:layout_marginLeft="14dp"
android:layout_marginRight="14dp"
android:layout_marginTop="11dp"
android:gravity="center"
android:textColor="@android:color/white"
android:textSize="15sp" />
</RelativeLayout>
</FrameLayout>
资源文件 :
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"> <!--这里循环播放-->
<item android:drawable="@mipmap/ic_volume_1" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_2" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_3" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_4" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_5" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_6" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_7" android:duration="350" />
<item android:drawable="@mipmap/ic_volume_8" android:duration="350" />
</animation-list>
最后附上 资源打包: