动画的分类:
- View Animation:视图动画在古老的Android系统中就已经提供了,只能被用来设置View的动画
- Drawable Animation:Frame动画,帧动画,专门用来一个一个的显示Drawable的resource,就像放幻灯片一样
- Peopety Animation:属性动画只对Android 3.0以上的版本系统才有效,这种动画可以设置给任何的Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让我们自定义任何类型和属性的动画
View Animation(视图动画):
视图动画,也叫Tween(补间)动画,可以在一个视图容器内执行一系列简单变换(位置,大小,旋转,透明度)。
补间动画通过XML或者Android代码定义,建议使用XML文件定义,因为它更具有可读性,可用性
- AlphaAnimation:渐变透明度动画效果 在XML中关键字为
<alpha>
- RotateAnimation:画面转移旋转动画效果 在XML中关键字为
<rotate>
- ScaleAnimation : 渐变尺寸伸缩动画效果 在XML中关键字为
<scale>
- TranslateAnimation:画面转换位置移动画效果 在XML中关键字为
<translate>
- AnimationSet:一个持有其他动画元素alpha,scale,translate,rotate或者其他set元素的容器
文件位置: res/anim/filename.xml
编译资源的数据类型:an Animation
资源引用:
Java: R.anim.filename
XML: @[package:]anim/filename
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
布局文件必须有一个独立的根元素,可以是<alpha>,<scale>, <translate>, <rotate>, <set>
(持有一组其它的动画元素,甚至可以是内嵌的set元素) 中的一个
<set>
一个持有其他动画元素的容器
属性:
android:interpolator
应用于动画的插值器。该值必须是一个指定了插值器资源的引用(不是一个插值器的类名),在平台中有缺省的插值器可以使用,或者我们可以创建自己的插值器资源
android:shareInterpolator
true:代表在所有的子元素中共享一个插值器
<alpha>
一个淡入淡出的动画
属性:
android:fromAlpha
android:toAlpha
代表动画开始和结束时的透明度,0.0表示完全透明,1.0表示完全不透明
<scale>*
可以实现动态调控件尺寸的效果,通过设置pivotX和pivotY,我们可以指定image缩放的中心点,比如,如果这些值是0,则表示左上角,所有的缩放变化将沿着右下角的轨迹运动
属性:
android:fromXScale
android:toXScale
android:fromYScale
android:toYScale
Float值,为动画起始到结束时,x,y坐标上的伸缩尺寸
0.0表示收缩到没有
1.0表示正常无伸缩
android:pivotX
android:pivotY
表示缩放的中轴点X/Y坐标值,浮点值
如果我们想表示中轴点为图像的中心,我们可以把两个属性值定义为0.5或者50%
<translate>
代表一个水平,垂直的位移
属性:
android:fromXDelta 代表起始X方向的位置
android:toXDelta
android:fromYDelta
android:toYDelta
代表动画起始或者结束X/Y方向上的位置,Float或者百分值
如果以浮点数字表示,是一个绝对值,表达相对自身原始位置的像素值
如果以num%表示,代表相对于自己的百分比,比如toXDelta定义为100%就表示X方向上移动自己的1倍距离
如果以num%p表示,代表相对于父类组件的百分比
<rotate>
旋转动画
属性:
android:fromDegrees
android:toDegrees
表示起始和结束的角度
android:pivotX 表示旋转中心的X的坐标值
android:pivotY表示旋转中心的Y的坐标值
这两个属性也有三种表示方式,但是X轴都是相对方向都是Left,Y轴都是相对于Top
浮点数、num%、num%p;
数字方式代表相对于自身左边缘的像素值,
num%方式代表相对于自身左边缘或顶边缘的百分比,
num%p方式代表相对于父容器的左边缘或顶边缘的百分比
调用代码
ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
另外,在动画中,如果我们添加了android:fillAfter=”true”后,这个动画执行完之后保持最后的状态;android:duration=”integer”代表动画持续的时间,单位为毫秒。
插值器:
用于修改一个动画过程中的速度,可以定义各种各样的非线性变化函数,比如加速,减速等。
在Android中所有的插值器都是Interpolator的子类,通过android:interpolator属性,我们可以引用不同的插值器。
我们可以通过下面的方式使用它们:
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
我们来看一个例子:
首先我在xml中这样定义:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:shareInterpolator="true"
android:duration="5000"
android:fillAfter="false"
android:repeatMode="reverse"
>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
/>
<rotate
android:fromDegrees="270"
android:toDegrees="-270"
android:pivotX="0.5"
android:pivotY="0.5"
/>
<translate
android:fromXDelta="20"
android:toXDelta="20"
android:fromYDelta="-40"
android:toYDelta="-40"
/>
</set>
我们来看看效果:
关于上面这些的实现类,可以参考我的另外一篇博客:
http://blog.csdn.net/qq_36391075/article/details/77841839
-Animation实现loading动画效果
如果我们对系统自带的插值器不满意,我们还可以自己定义插值器:
像这样:
<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:cycles = "10"
/>
我们再看效果:
我们来看看插值器可调整的属性:
- android:factor 浮点值,加速速率,默认为1
- android:tension 浮点值,起始点后退的张力,拉力数,默认为2
- android:cycles int,循环的个数,默认为1
所有的interpolator都实现了interpolator接口,这个接口定义了一个方法:
@Override
public float getInterpolation(float v) {
return v;//匀速
}
Frame动画
文件目录:res/drawable/filename.xml
编译资源数据类型:AnimationDrawable
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable.filename
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
必须作为根元素,包含一个或者多个根元素
属性:
android:oneshot true为只执行一次动画,false :无限执行
item中:
属性:
android:drawable 用于这一帧的图片
android:duration integer类型,该帧的时长,单位为毫米
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_1" android:duration="300"/>
<item android:drawable="@drawable/ic_2" android:duration="300"/>
<item android:drawable="@drawable/ic_3" android:duration="300"/>
</animation-list>
private void frame(){
ImageView imageView = (ImageView)findViewById(R.id.iv_ball);
AnimationDrawable drawable = (AnimationDrawable) imageView.getDrawable();
drawable.start();
}
效果:
属性动画
目录:res/animator/filename.xml
编译后的资源为:ValueAnimation,ObjectAnimation,AnimatiorSet
XML文件的根元素必须为上面三个之一或者也可以在set中组织不同的动画,包含其他元素,也就是说可以嵌套
<set
android:ordering=["together" | "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
我们先看看属性:
set:
android:ordering:代表它的子动画的启动方式是先后有序还是同时
sequentially:动画按照先后顺序
together:动画同时启动
objectAnimator:
属性:
android:propertyName:
String类型,必须要设定的值,代表要执行动画的属性,通过名字的引用,比如我们可以指定了一个View的‘alpha’或者“backgroundColor”,这个objectAnimator元素没有暴露target属性,因此不能够在XML中执行一个动画,必须通过调用loadAnimation()填充我们的XML动画资源,并且调用setTarget应用到拥有这个属性的目标对象上。
android:valueTo:Float,int或者color,也是必须值,表明了动画结束的点。
android:valueFrom:相对应valueTo,动画的起点,如果没有指定,系统会通过属性身上的get方法获取
android:duration:动画的时长,默认为300毫秒
android:startOffset:动画延迟的时间,从调用start方法后开始计算,ini型
android:repeatCount:一个动画重复的次数,int型,-1代表无限循环,1表示动画在第一次执行完后重复执行一次,默认为0
android:repeatMode:重复模式,int型,当一个动画执行完的时候应该如何处理
reverse:会使动画按照向相反的方向执行
repeat:会使动画每次从头开始执行
android:valueType:关键参数,如果如果该value是一个颜色,那么就不需要指定,因为动画框架会自动的处理颜色值。
有intType和floatType两种:分别说明动画值为int和float型。
在一个特定的时间里执行一个动画
floatType (default)
关于属性动画的知识还有很多,之后继续补充
练习的东西:https://github.com/vivianluomin/PracticeEveryDay/tree/master/TestAnimation