浅谈Android 动画效果

 

Android有着丰富的动画效果,其主分为3种,逐帧动画、补间动画、属性动画,在这里先简单介绍逐帧动画与补间动画的基础使用。

1.逐帧动画

首先,逐帧动画,顾名思义就是将图片一帧帧地显示出来以此来达到动画效果,其本质也是如此:按序播放一组预先定义好的图片,所以要使用逐帧动画我们需要先使用gif分解器分解gif动图得到一组gif动图的帧图片。
设置并启动动画:
这里有2种方式
1.xml方式
     (1)在drawable文件夹下创建.xml文件。
     (2)设置图片资源

 
 

<?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/fight1" android:duration="100"/>

<item android:drawable="@drawable/fight2" android:duration="100"/>

<item android:drawable="@drawable/fight3" android:duration="100"/>

<item android:drawable="@drawable/fight4" android:duration="100"/>

<item android:drawable="@drawable/fight5" android:duration="100"/>

<item android:drawable="@drawable/fight6" android:duration="100"/>

<item android:drawable="@drawable/fight7" android:duration="100"/>

<item android:drawable="@drawable/fight8" android:duration="100"/>

<item android:drawable="@drawable/fight9" android:duration="100"/>

<item android:drawable="@drawable/fight10" android:duration="100"/>

<item android:drawable="@drawable/fight11" android:duration="100"/>

<item android:drawable="@drawable/fight12" android:duration="100"/>

<item android:drawable="@drawable/fight13" android:duration="100"/>

<item android:drawable="@drawable/fight14" android:duration="100"/>

<item android:drawable="@drawable/fight15" android:duration="100"/>

<item android:drawable="@drawable/fight16" android:duration="100"/>

<item android:drawable="@drawable/fight17" android:duration="100"/>

</animation-list>

(3)在java代码中载入启动动画

mStartButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mImageView.setImageResource(R.drawable.attack);
        animationDrawable=(AnimationDrawable)mImageView.getDrawable();
        animationDrawable.start();
    }
});
mStopButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mImageView.setImageResource(R.drawable.attack);
        animationDrawable=(AnimationDrawable)mImageView.getDrawable();
        animationDrawable.stop();
    }
});

2.Java代码方式

animationDrawable = new AnimationDrawable();
for (int i = 1; i <= 17; i++)
{ 
    int id = getResources().getIdentifier("fight" + i, "drawable", getPackageName());
    Drawable drawable = getResources().getDrawable(id); animationDrawable.addFrame(drawable, 100); 
}

mStartButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
        animationDrawable.setOneShot(true); 
        mImageView.setImageDrawable(animationDrawable); // 获取资源对象 animationDrawable.stop(); // 特别注意:在动画start()之前要先stop(),不然在第一次动画之后会停在最后一帧,这样动画就只会触发一次 
        animationDrawable.start(); // 启动动画 
    } 
});

mStopButton.setOnClickListener(new View.OnClickListener() {
    @Override 
    public void onClick(View v) {
                animationDrawable.setOneShot(true);
                mImageView.setImageDrawable(animationDrawable);
                animationDrawable.stop(); 
    }
});

特点:方便、简单。
缺点:容易引起OOM,因为会使用大量且尺寸较大图片,所以应尽量避免使用大尺寸图片。

2.补间动画

 

 

根据不同的动画效果,补间动画分为4种动画:
1.平移动画(translate)
2.缩放动画(scale)

3.旋转动画(rotate)
4.透明动画(alpha)

同样补间动画也有xml和java2种实现方式,下面以平移效果为例。
1.xml方式
(1)创建.xml文件

(2)根据不同的动画效果,设置不同的属性

 

<?xml version="1.0" encoding="utf-8"?> // 采用<translate /> 标签表示平移动画

<translate xmlns:android="http://schemas.android.com/apk/res/android" // 以下参数是4种动画效果的公共属性,即都有的属性

android:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果

android:startOffset ="1000" // 动画延迟开始时间(ms)

android:fillBefore = “true” // 动画播放完后,视图是否会停留在动画开始的状态,默认为true

android:fillAfter=“false”//动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false android:fillEnabled= “true” // 是否应用fillBefore值,对fillAfter值无影响,默认为true

android:repeatMode= “restart” // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart android:repeatCount = “0” // 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复

android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影响动画的播放速度 // 以下参数是平移动画特有的属性

android:fromXDelta="0" // 视图在水平方向x 移动的起始值

android:toXDelta="500" // 视图在水平方向x 移动的结束值

android:fromYDelta="0" // 视图在竖直方向y 移动的起始值

android:toYDelta="500" // 视图在竖直方向y 移动的结束值 />

(3)在java代码中创建Animation对象实现动画效果

 

Button mButton = (Button) findViewById(R.id.btn_translate); // 步骤1:创建 需要设置动画的 视图View Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.view_animation); // 步骤2:创建 动画对象 并传入设置的动画效果xml文件

mButton.startAnimation(translateAnimation); // 步骤3:播放动画

2.java代码方式

 

Animation translateAnimation= new TranslateAnimation(0,500,0,500);

translateAnimation.setDuration(3000);

translateAnimation.setFillBefore(false);

translateAnimation.setFillAfter(true);

translateAnimation.setRepeatMode(2);

translateAnimation.setRepeatCount(1);

mTranslateButton.setAnimation(translateAnimation);

其余的动画效果方式可参考各自的方法参数进行修改,这里就不说明了。

 

值得一提的是Animation在view被创建时才会执行,也就是说如果我们采用按钮点击事件来设置不同的动画效果时采用setAnimation()赋予view控件动画效果后要刷新一次view,即调用invalidate()才能看到动画效果

 

mLinearLayout.invalidate();

之后会将到属性动画与弹性动画SpringAnimation。

码云测试代码

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值