引用:Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。Frame动画可以被定义在XML文件中,也可以完全编码实现。
继承关系介绍:
从继承关系中可以看出来,其实AnimationDrawable就是一个绘画容器。使用时,将多个绘制出来的图片添加到AnimationDrawable中,再一帧帧的播放出来,从而达到动画效果。和一开始引用的介绍内容不谋而合。
AnimationDrawable方法 | 功能 |
---|---|
addFrame(Drawable frame, int duration) | 添加一个帧动画 |
getDuration(int i) | 获得帧动画的时间 |
getFrame(int index) | 获得指定索引的Drawable对象 |
getNumberOfFrames() | 获得帧动画的总数 |
isOneShot() | 帧动画是否只运行一次 |
isRunning() | 帧动画是否处于运行状态 |
setOneShot(boolean onsShot) | 设置帧动画是否只运行一次 |
setVisible(boolean visible, boolean restart) | 设置帧动画是否可见 |
start() | 运行帧动画 |
stop() | 停止帧动画 |
XML文件常用属性 | 功能介绍 |
---|---|
android:drawable[drawable] | 加载Drawable对象 |
android:duration[long] | 每一帧动画的持续时间(单位ms) |
android:oneshot[boolean] | 动画是否只运行一次,true运行一次,false重复运行 |
android:visible[boolean] | Drawable对象的初始能见度状态,true可见,false不可见(默认为false) |
添加四个ShapeDrawable类XML文件,分别如下:
anim_1.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!-- solid指定形状的填充色,只有android:color一个属性 -->
<solid android:color="#f40c08" />
</shape>
anim_2.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!-- solid指定形状的填充色,只有android:color一个属性 -->
<solid android:color="#f4f408" />
</shape>
anim_3.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!-- solid指定形状的填充色,只有android:color一个属性 -->
<solid android:color="#08f410" />
</shape>
anim_4.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!-- solid指定形状的填充色,只有android:color一个属性 -->
<solid android:color="#0833f4" />
</shape>
视图布局XML如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.abe.frameanimation.MainActivity">
<View android:id="@+id/view" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Hello World!" />
</RelativeLayout>
活动界面java代码如下
public class MainActivity extends AppCompatActivity {
private View view;
private AnimationDrawable rocketAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (View) findViewById(R.id.view);
rocketAnimation = new AnimationDrawable();
Resources res = getResources();
Drawable drawable = res. getDrawable(R.drawable.anim_1, null);
rocketAnimation.addFrame(drawable, 500);
drawable = res. getDrawable(R.drawable.anim_2, null);
rocketAnimation.addFrame(drawable, 1000);
drawable = res. getDrawable(R.drawable.anim_3, null);
rocketAnimation.addFrame(drawable, 500);
drawable = res. getDrawable(R.drawable.anim_4, null);
rocketAnimation.addFrame(drawable, 1000);
rocketAnimation.setOneShot(false);
view.setBackground(rocketAnimation);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}else if(event.getAction() == MotionEvent.ACTION_UP){
rocketAnimation.stop();
return true;
}
return super.onTouchEvent(event);
}
}
XML例子中,用到的Drawable图像,同样使用Java例子中用到的4个ShapeDrawable。在res/drawable文件夹下面创建AnimationDrawable的XML文件,命名为anim_frame.xml。
XML内容如下:
<?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/anim_1" android:duration="1000" />
<item android:drawable="@drawable/anim_2" android:duration="200" />
<item android:drawable="@drawable/anim_3" android:duration="1000" />
<item android:drawable="@drawable/anim_4" android:duration="200" />
</animation-list>
活动界面java代码如下
public class MainActivity extends AppCompatActivity {
private View view;
private AnimationDrawable rocketAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (TextView) findViewById(R.id.textView);
view.setBackgroundResource(R.drawable.anim_frame);
rocketAnimation = (AnimationDrawable) textView.getBackground();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}else if(event.getAction() == MotionEvent.ACTION_UP){
rocketAnimation.stop();
return true;
}
return super.onTouchEvent(event);
}
}
特别注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中调运,因为AnimationDrawable还未完全附着到window上,所以最好的调运时机是onWindowFocusChanged()方法中。
http://www.cnblogs.com/menlsh/archive/2013/01/01/2841393.html