逐帧动画是通过播放关键帧来达到动画的效果,基本类是Drawable的子类AnimationDrawable。可以通过xml资源文件和java代码来实现,一般推荐直接在xml中实现,也可以在java代码中对其进行一些动态的操作。
1. 用xml文件实现
1. 准备要播放的帧的图片:
2. 以animation-list为根节点创建xml文件animation1:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/yuyin1" android:duration="300"></item>
<item android:drawable="@drawable/yuyin2" android:duration="300"></item>
<item android:drawable="@drawable/yuyin3" android:duration="300"></item>
</animation-list>
其中oneshot表示是否只播放一次,item依播放次序添加,duration表示每一帧的播放时间。
3. 在布局文件中把animation1作为资源文件进行引用:
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center"
android:src="@drawable/animation1"/>
4. 获取AnimationDrawable并进行播放:
AnimationDrawable animationDrawable= (AnimationDrawable) mImageView.getDrawable();
animationDrawable.start();
AnimationDrawable的常用方法:
- void start() - 开始播放动画
- void stop() - 停止播放动画
- addFrame(Drawable frame, int duration) - 添加一帧,并设置该帧显示的持续时间
- void setOneShoe(boolean flag) - false为循环播放,true为仅播放一次
- boolean isRunning() - 是否正在播放
start()方法不能在onCreate()函数中调用。因为AnimationDrawable并未完全关联到Window,在onCreate()方法中,View并未完成显示
2. 用java代码
用java代码实现主要是利用AnimationDrawable的addFrame()方法自己构建AnimationDrawable实例,示例如下:
AnimationDrawable animationDrawable = new AnimationDrawable();
for (int i = 1; i <= 3; i++) {
int id = getResources().getIdentifier("yuyin" + i, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable, 200);
}
animationDrawable.setOneShot(false);
mImageView.setImageDrawable(animationDrawable);
最终效果:
3. animated-selector
animated-selector是Lollipop版本中的新特性,使用它可以实现控件状态改变时的过渡动画,但是他只能在Lollipop以上的版本中使用,所以还需要适配低版本的设备。
1. 再新建一个以animation-list为根节点创建xml文件animation2,实现倒放的动画效果:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/yuyin3" android:duration="300"></item>
<item android:drawable="@drawable/yuyin2" android:duration="300"></item>
<item android:drawable="@drawable/yuyin1" android:duration="300"></item>
</animation-list>
2. 在drawable-v21中新建以animated-selector为根节点的资源文件selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/unselect"
android:state_selected="false">
<bitmap
android:src="@drawable/yuyin1"/>
</item>
<item
android:id="@+id/select"
android:state_selected="true">
<bitmap
android:src="@drawable/yuyin3"/>
</item>
<transition
android:fromId="@+id/unselect"
android:toId="@+id/select"
android:drawable="@drawable/animation1">
</transition>
<transition
android:fromId="@id/select"
android:toId="@id/unselect"
android:drawable="@drawable/animation2">
</transition>
</animated-selector>
与普通的selector资源不同的是,animated-selector的item中加了一个id来标识状态,并在transition中引用animation1和animation2来实现两个状态的转换动画。上面的例子中实现了在selected状态改变时播放的动画。
3. 在drawable中新建同名的selector文件,实现在低版本中的状态转换效果:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="false">
<bitmap
android:src="@drawable/yuyin1"/>
</item>
<item
android:state_selected="true">
<bitmap
android:src="@drawable/yuyin3"/>
</item>
</selector>
4. 在imageview中引用selector,并在java代码中控制其状态:
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center"
android:src="@drawable/selector"/>
mImageView= (ImageView) findViewById(R.id.imageview);
start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mImageView.setSelected(true);
}
});
stop = (Button) findViewById(R.id.stop);
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mImageView.setSelected(false);
}
});
效果:
相关文章: