Android-Frame Animation介绍

介绍:


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

继承关系介绍:

继承图片

从继承关系中可以看出来,其实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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值