Android-Frame Animation介绍

介绍:

引用:Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。Frame动画可以被定义在XML文件中,也可以完全编码实现。

继承关系介绍:

Android-Frame Animation介绍_第1张图片

从继承关系中可以看出来,其实AnimationDrawable就是一个绘画容器。使用时,将多个绘制出来的图片添加到AnimationDrawable中,再一帧帧的播放出来,从而达到动画效果。和一开始引用的介绍内容不谋而合。

AnimationDrawable类java方法介绍

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() 停止帧动画

AnimationDrawable的XML常用属性介绍

XML文件常用属性 功能介绍
android:drawable[drawable] 加载Drawable对象
android:duration[long] 每一帧动画的持续时间(单位ms)
android:oneshot[boolean] 动画是否只运行一次,true运行一次,false重复运行
android:visible[boolean] Drawable对象的初始能见度状态,true可见,false不可见(默认为false)

java代码例子

添加四个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例子

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

你可能感兴趣的:(动画,android)