今天我们将会探讨动画的学习,Android的动画分成三类
1. Tween Animation(补间动画、视图动画):通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生的动画效果,即是一种渐变动画。
2. Frame Animation(帧动画):顺序播放事先做好的图像,是一种画面转换动画。
3. Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。
注意:我们常用的Tween Animations有一个很大的缺陷是不具备交互性,也可以这么认为,就是我们的视图动画只能作为一种动画效果View,而不能作为一个交互,详细的我们后面会说到.
Tween Animation有四种形式,相对比较简单.
alpha : 渐变透明动画效果。
scale : 渐变尺寸伸缩动画效果。
translate : 画面位置移动动画效果。
rotate : 画面旋转动画效果。
Animation类是所有动画(scale、alpha、translate、rotate)的基类,从Animation类继承的属性
android:duration:动画持续时间,以毫秒为单位。
android:fillAfter:如果设置为true,控件动画结束时,将保持动画最后时的状态。
android:fillBefore:如果设置为true,控件动画结束后,还原到开机动画前的状态。
android:fillEnabled:与android:fillBefore的效果相同,都是在动画结束时将控件还原到初始状态。
android:repeatCount:重复次数
android:repeatMode:重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍。
scale的参数如下(一般用于XML文件当中):
android:fromXScale:起始的X方向上相对自身的缩放比例,浮点值。例如1.0代表无变化,0.5代表起始时虽小一倍,2.0代表放大一倍。
android:toXScale:结束时X方向上相对自身的缩放比例。
android:fromYScale:起始时Y方向上相对自身的缩放比例。
android:toYScale:结束时Y方向上相对自身的缩放比例。
android:pivotX:缩放起点X轴坐标,可以是数值、百分比、百分数三种形式。(注意:起点指的是当前View左上角的坐标)
android:pivotY:缩放起点Y轴坐标。
XML代码:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="700"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:fillAfter="true"
android:toXScale="3"
android:toYScale="3">
scale>
Main代码:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale);
animImageView.startAnimation(animation);
参数:
android:fromAlpha:动画开始的透明度,从0.0~1.0,0.0表示完全透明,1.0表示完全不透明。
android:toAlpha:动画结束的透明度,也是从0.0~1.0。
XML代码:
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fillBefore="true"
android:fromAlpha="0.0"
android:toAlpha="1.0" >
alpha>
Main代码:
Animation alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.anim_alpha);
animImageView.startAnimation(alphaAnimation);
参数:
android:fromDegrees:开始旋转的角度位置,正数值代表顺时针的角度,负数值代表逆时针旋转的角度。
android:toDegrees:结束时旋转到的角度位置,正数值代表顺时针的角度,负数值代表逆时针旋转的角度。
android:pivotX:旋转起点的X轴坐标。
android:pivotY:旋转起点的Y轴坐标。
XML代码:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fillAfter="true"
android:fromDegrees="0"
android:pivotX="0"
android:pivotY="0"
android:repeatCount="3"
android:toDegrees="810" >
rotate>
Main代码:
Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.anim_rotate);
animImageView.startAnimation(rotateAnimation);
参数:
android:fromXDelta:起始X轴坐标。
android:fromYDelta:起始Y轴坐标。
android:toXDelta:结束X轴坐标。
android:toYDelta:结束Y轴坐标。
XML代码:
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:fromXDelta="0.0"
android:toXDelta="60%p" >
translate>
Main代码:
Animation transAnimation = AnimationUtils.loadAnimation(this, R.anim.translate);
scaleButton.startAnimation(transAnimation);
当然,其实我们可能经常会看到没有出现xml文件,也能做简单的动画,那是因为我们有相关的API.
AlphaAnimation:
参数:
第一个参数fromAlpha表示动画起始时的透明度 第二个参数toAlpha表示动画结束时的透明度
//初始化
Animation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
//设置动画时间 alphaAnimation.setDuration(3000);
this.startAnimation(alphaAnimation);
RotateAnimation:
参数:
第一个参数fromDegrees表示动画起始时的角度, 第二个参数toDegrees表示动画结束时的角度。
拓展:
设置伸缩模式pivotXType、pivotYType,伸缩动画相对于x,y坐标的开始位置pivotXValue、pivotYValue等
Animation rotateAnimation = new RotateAnimation(0f, 360f);
rotateAnimation.setDuration(1000);
this.startAnimation(rotateAnimation);
ScaleAnimation:
参数:
第一个参数fromX ,第二个参数toX:分别是动画起始、结束时X坐标上的伸缩尺寸。
第三个参数fromY ,第四个参数toY:分别是动画起始、结束时Y坐标上的伸缩尺寸。
另外还可以设置伸缩模式pivotXType、pivotYType, 伸缩动画相对于x,y 坐标的开始位置pivotXValue、pivotYValue等。
//初始化
Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);
//设置动画时间
scaleAnimation.setDuration(500);
this.startAnimation(scaleAnimation);
TranslateAnimation:
参数:
第一个参数fromXDelta ,第二个参数toXDelta:分别是动画起始、结束时X坐标。
第三个参数fromYDelta ,第四个参数toYDelta:分别是动画起始、结束时Y坐标。
//初始化
Animation translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);
//设置动画时间 translateAnimation.setDuration(1000);
this.startAnimation(translateAnimation);
当然我们可以引出动画集合
//这个集合能够将动画融合在一起
AnimationSet as=new AnimationSet(true);
as.setDuration(1000);
刚才说的补间动画貌似已经满足了很大部分的UI需求.但是Twwen Animation改变得到知识动画的显示,并不能响应事件,其中这个恰恰是它的致命缺陷.就是其身上的不具有交互性.
这种不具有交互性体现在哪里?
譬如说,某个视图元素发生动画后,其相应事件的位置依然在动画前的地方所以一般我们对于视图动画只能做普通动画,其实你也可以抛弃它了,拥抱属性动画.不过属性动画的不足就是相比于Tween View就是比较慢,麻烦一点.
创建一个ObjectAnimator基类:
private void startAnimator() {
ObjectAnimator animator = ObjectAnimator.ofFloat(mImageView, "translationY", 300);
animator.setDuration(5000);
animator.start();
}
理解:
1. 通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象。
2. 参数:
第一个参数是需要操纵的View,第二个参数则是需要操纵的属性,而最后一个参数是一个可变数组参数
拓展:
上面说到的属性,就是第二个方法其实我们是必须它拥有set,get的方法
translationX、translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标开始的位置。
rotation、rotationX、rotationY:这三个属性控制着View对象围绕它的支点进行2D和3D的旋转。
scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。
pivotX和pivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下,该支点的位置就是View对象的中心点。
alpha:它表示View对象的alpha透明度。
x、y:这是两个简单的实用的属性,它描述了View对象在它的容器中最终的位置。
为什么要这么做呢?
因为我们的属性动画最重要的一点,我们不仅仅是解决视图显示问题,是修改了相应控件的属性.
当然我们可以通过封装一个外层View进行控制.
import android.view.View;
public class WrapperView {
private View mTarget;
public WrapperView(View target) {
this.mTarget = target;
}
public int getWidth() {
return mTarget.getLayoutParams().width;
}
public void setWidth(int width) {
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
ValueAnimator是一个数值发生器,其实给我个人感觉就是说等于一个差值器的作用.将初始值和结束值交给ValueAnimator,并且告诉它动画需要运行的时长.那么ValueAnimator就会自动帮助我们完成从初始值平滑过渡到结束值这样的效果.
当然其中ValueAnimator会有一个AnimatorUpdateListener()方法监听数值的变换,进而完成动画变换.
在补间动画学习时,我们知道可以利用AnimationSet将补间动画组合使用,同样的,属性动画也提供了AnimatorSet这个类来帮我们实现组合属性动画的效果。
AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ObjectAnimator或者ValueAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包含了以下四个方法:
after(Animator anim) : 将现有动画插入到传入的动画之后执行。
after(long delay):将现有的动画延迟指定的毫秒后执行。
before(Animator anim):将现有的动画插入到传入的动画之前执行。
with(Animator anim):将现有的动画和传入的动画同时执行。
总结:
大家只要记得区别:
1. 一个是视图修改,一个是内部修改
2. 一个是只能作用View,属性动画是用于对象,你自定义控件中的点都可以使用.
3. 记住Tween的致命缺陷,不能交互.