安卓中我们经常会使用动画来渲染我们的APP,使其“动”起来,对于常用的动画通常分为两类:View Animation(视图动画)和Property Animation(属性),当然View Animation又分为Frame Animation(帧动画)和Tween Animation(补间动画),因此常常会将动画分为三种:Frame Animation,Tween Animation,和Property Animation。本文我们主要讲述以下内容:
- Android动画分类
- Frame Animation
- Tween Animation
- 插值器
- Propterty Animation
- Fragment/Activity动画
一、Frame Animation
对于帧动画的实现,我们有两种方式,一种就是通过在xml布局中实现,一种是直在代码中实现,具体的实现过程如下:
1、XML实现
①:在androidStudio中点击APP,然后右击选择“Android resource file”,弹出对话框后填写属性名称,选择“animation-list”和“drawable目录。
②:在xml文件中 编写我们的代码
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"><!--选择true表示一次播放 false表示连续播放-->
<item android:drawable="@drawable/a"
android:duration="200"></item> <!--选择图片的地址 播放时间-->
<item android:drawable="@drawable/b"
android:duration="200"></item> <!--选择图片的地址 播放时间-->
<item android:drawable="@drawable/c"
android:duration="200"></item> <!--选择图片的地址 播放时间-->
<item android:drawable="@drawable/d"
android:duration="200"></item> <!--选择图片的地址 播放时间-->
</animation-list>
这里有几个属性需要我们注意:
- oneshot:当为true时表示一次播放,为false表示连续播放
- duration:表示该帧执行的时间(图片停留时间)
设置好xml文件后,我们便可以在代码运用该文件,具体实现的代码如下:
iv_animation.setBackgroundResource(R.drawable.frame_animation);//imageView设置为背景
AnimationDrawable drawable = (AnimationDrawable) iv_animation.getBackground();//获取该动画对象
drawable.start();//开启动画
注意:由于我们采用的是直接图片的不断轮循加载,要注意OOM的产生。
2、代码实现
对于代码实现的效果与XML实现的效果是一样的,对于控件的属性的设置也是一样的,下面通过一段实例代码我们可以详细了解一下。
public void frameAniamtion(){
int [] draws = new int[]{R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};
AnimationDrawable animationDrawable = new AnimationDrawable();
for (int i = 0; i <draws.length ; i++) {
int id = draws[i];//获取图片id
Drawable drawable = getResources().getDrawable(id);//转为drawable属性
animationDrawable.addFrame(drawable,200);//图片资源 时间
}
animationDrawable.setOneShot(false);//设置为不断的轮播
iv_animation.setBackgroundDrawable(animationDrawable);//设置到view控件中
animationDrawable.start();//开启动画效果
}
同样我们也是需要对于关键的属性进行设置,然后运用于view中。
运行效果截图
二、Tween Animation
Tween Animation即补间动画,主要分为四种,分别是平移、缩放、旋转、透明度, 下面我们通过一段实例代码来详细了解一下。需要注意的是我们在创建Tween Aniamtion的xml文件时,需要选择anim文件。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:repeatMode="restart"
android:duration="2000"
android:fillAfter="false">
<!--透明度 0——1(全部展示)-->
<alpha android:fromAlpha="1"
android:toAlpha="1"></alpha>
<!--旋转动画 角度0——180 旋转中心坐标点-->
<rotate android:fromDegrees="0"
android:toDegrees="180"
android:pivotX="10"
android:pivotY="10"></rotate>
<!--缩放动画-->
<scale android:pivotY="200"
android:pivotX="200"
android:fromXScale="10"
android:fromYScale="10"
android:toXScale="50"
android:toYScale="50"></scale>
<translate android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="100"></translate>
</set>
在上面的语法中我们需要注意的是平移的时候其实位置接受百分比数值:从-100到100的值,以“%”结尾,表示百分比相对于自身;从-100到100的值,以“%p”结尾,表示百分比相对于父容器。例如平移开始位置在自身中间则是50%,如平时开始位置在父容器的则是50%p.
同样对于Tween动画我们也可以通过代码来实现。
三、插值器
在动画插值器起的作用主要是改变动画的执行速率,一般情况我们不需要自己实现插值器,因为在Android中已经给我们提供了9种插值器,应该够我们使用了,我们使用插值器后会让动画执行的效果更酷炫,当然想自定义插值器也不难,可以查看已经实现插值器源码做参考。
**•accelerate_decelerate_interpolator:**先加速后减速
**•accelerate_interpolator:**一直加速
•anticipate_interpolator: 开始的时候先向后甩一点然后向前,就好比人扔东西会先向后甩一下,这样才能抛的远
**•anticipate_overshoot_interpolator:**和上一种插值器相似,先向后抛然后向前,到达终点后会有回弹一下效果,好比我们将球抛到墙上,然后反弹回来
**•bounce_interpolator:**动画结束的时候弹起,类似皮球落地,会弹几下才停止
**•cycle_interpolator:**动画循环播放特定的次数回到原点,速率改变沿着正弦曲线
**•decelerate_interpolator:**减速的插值器,刚开始速度快,然后越来越慢直到停止
**•linear_interpolator:**线性的插值器。从开始到结束匀速运动
**•overshoot_interpolator:**向前超过设定值一点然后返回
插值器主要是用在Tween Animation中的。
同样对于动画我们可以通过监听动画的属性来设置,
AnimationSet animationSet = (AnimationSet) AnimationUtils.loadAnimation(MainActivity.this,R.anim.tween_animation);
iv_animation.startAnimation(animationSet);
animationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
四、Propterty Animation
属性动画是3.0之后引入的,在View动画中虽然我们看到了我们的控件位置发生发生变化,比如Button虽然位置变化了,但是点击响应区域还在原来的位置。而属性动画就可以解决这种问题。它可以作用于View的属性。对于属性动画分为ObjectAnimator 和ValueAnimator 。
首先我们基于XML进行一次配置(创建该xml文件步骤:APP右键–Android resource file–animator)。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:propertyName="objectAnimator"
android:duration="2000"
android:valueFrom="0"
android:valueTo="200"
android:startOffset="10"
android:repeatCount="-1"
></objectAnimator>
</set>
在代码中的运用
Animator animationSet2 = AnimatorInflater.loadAnimator(MainActivity.this, R.animator.proptery_animation);
animationSet2.setTarget(iv_animation);
animationSet2.start();
对于参数的说明:
translationX 和 translationY : 控制View距离左边和顶部的距离的增加值。是一个相对值。相对于自身位置的具体。
•rotation 、 rotationX 和 rotationY : rotation 是控制View围绕其支点进行旋转。 rotationX 和 rotationY 分别是围绕X轴和Y轴旋转。
•scaleX 和 scaleY : 控制View的缩放。
•pivotX 和 pivotY : 控制View的支点位置,进行旋转和缩放,默认是View的中点。它们都是 float 值, 0 表示View的最左边和最顶端, 1 表示最右端和最下端。
•alpha : 控制View的透明度。
•x 和 y : 控制View在布局容器中距离左边和顶部的距离。是一个绝对值。
同样我们也可以使用代码实现
ObjectAnimator.ofFloat(iv_animation,"rota",0,180,0,90).setDuration(1000).start();//旋转动画
对于多种动画结合的效果,同样我们也可以使用set集合的效果。
详细的讲解大家可以参照鸿洋
四、Fragment/Activity动画
Activity实现动画也很简单,在Activity中提供了overridePendingTransition(int enterAnim, int exitAnim) 方法,该方法接收两个参数,第一个参数是Activity进入时的动画,第二个参数是Activity退出时的动画。该方法一般写在startActivity()后和finish()后,如果我们想打开或者退出不显示动画,可将参数设置为0。同理Fragment也可相应设置,如activityCloseEnterAnimation改为fragmentCloseEnterAnimation即可。