Android动画主要分为三种:
- View Animation:视图动画也叫tween(补间动画),只能被用来设置view的动画
- Drawable Animation: frame动画或逐帧动画,专门用来显示一个个的Drawable,像放幻灯片一样
- Property Animation:属性动画,只对Android3.0(api 11)以上生效,这种动画可以给任何Object,这种动画可扩展,可以自定义任何类型和属性
视图动画
一、 View Animation概述
视图动画也叫补间动画,该动画可以在一个视图容器内执行一系列的简单变换(位置、大小、平移、旋转),补间动画通过XML或Android代码定义,一般建议用XML文件来定义,因为它更具可读性、可重用性;
java类名 | xml关键字 | 描述 |
---|---|---|
AlphaAnimation | 透明度渐变效果 | |
RotateAnimation | 画面旋转效果 | |
TraslateAnimation | 画面位置移动效果 | |
ScaleAnimation | 尺寸伸缩效果 | |
AnimationSet | 一个包含其他动画元素alpha、ratate、traslate、scale或者其他set元素的容器 |
二、属性和方法说明
1、 可以看出Animation抽象类是所有补间动画类的基类,接下来我们看看基类提供的一些通用的属性吧。
xml属性 | java方法 | 描述 |
---|---|---|
android:detachWallpaper | setDetachWallpaper(boolean) | 是否在壁纸上运行 |
android:duration | setDuration(long) | 动画持续时间 |
android:fillAfter | setFillAfter(boolean) | 控制动画结束时是否保持动画最后的状态 |
android:fillBefore | setFillBefore(boolean) | 控制动画结束是否还原动画开始前的状态 |
android:interpolator | setInterpolater(interpolator) | 设置插值器(指定动画执行速度、譬如线性执行,加速执行等) |
android:repeatCount | setRepeatCount(int) | 重复次数 |
android:repeatMode | setRepeatMode(int) | 设置重复类型:reverse倒序回放、restart从头播放 |
android:startOffset | setOffset(long) | 延迟多少毫秒开始执行动画,单位为毫秒 |
android:zAdjustment | setAdjustment(int) | 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal |
2、 接下来分别看看每种补间动画特有的属性和方法说明
a、 Alpha属性详解
下面的java方法是构造函数传参数
xml属性 | java方法 | 描述 |
---|---|---|
android:fromAlpha | AlphaAnimation(float fromAlpha,…) | 动画的开始透明度0.0-1.0,0.0为全透明,1.0为全不透明 |
android:toAlpha | AlphaAnimation(…,float fromAlpha) | 动画结束的透明度同上 |
b、Rotate属性详解
xml属性 | java方法 | 描述 |
---|---|---|
android:fromDegrees | RatateAnimation(float fromDegrees,…) | 旋转开始角度,正数代表顺时针旋转,负数代表逆时针旋转 |
android:toDegrees | RatateAnimation(…,float toDegrees) | 旋转结束角度同上 |
android:pivotX | RatateAnimation(…,float pivotX,…) | 旋转起点x坐标 (数值、百分数、百分数p,譬如50表示以当前view左上角坐标加50dp为起始点、50%表示以当前view左上角坐标加宽高的50%为起始点、50%p表示以当前view左上角坐标加父控件宽高的50%作为起点) |
android:pivotY | RatateAnimation(…,float toDegrees) | 旋转起点y坐标 (同上) |
c、Scale属性详解
xml属性 | java方法 | 描述 |
---|---|---|
android:fromXScale | ScaleAnimation(float fromX,…) | 初始x轴缩放比例(1.0表示无变化) |
android:toXScale | ScaleAnimation(…,float toX,…) | 结束时x轴的缩放比例 |
android:fromYScale | ScaleAnimation(…,float fromY,…) | 初始y轴缩放比例(1.0表示无变化) |
android:toYScale | ScaleAnimation(…,float toY,…) | 结束时y轴的缩放比例 |
android:pivotX | ScaleAnimation(…,float pivotX,…) | 同Rotate |
android:pivotY | ScaleAnimation(…,float pivotY,…) | 同Rotate |
d、 translate属性详解
xml属性 | java方法 | 描述 |
---|---|---|
android:fromXDelta | TranslateAnimation(float fromXDelta,…) | 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点) |
android:toXDelta | TranslateAnimation(…,float toX,…) | 结束时x轴的坐标(同上) |
android:fromYDelta | ScaleAnimation(…,float fromY,…) | 起始点y轴坐标(同上) |
android:toYDelta | ScaleAnimation(…,float toY,…) | 结束点y轴坐标(同上) |
e、 AnimationSet几层自Animation是上面四种动画元素的容器管理类,没有自己特有的属性,他的属性集成自Animation,所以当我们对set标签使用Animation的属性时会对该标签下的所有元素都产生影响
三、补间动画使用方法及示例代码
xml的使用方式:
Android代码中调用:
通过AnimationUtils来加载上述的xml动画资源
android 代码的使用方式:
这里只示范了AlphaAnimation的使用,其他三种类型的使用也是一样
此外Animation还有一些比较实用的方法
Animation类的方法 | 描述 |
---|---|
reset() | 重置动画 |
cancle() | 取消动画 |
start() | 开始动画 |
setAnimationListener(AnimationListener listener)) | 给当前动画设置监听 |
hasStarted() | 判断当前动画是否开始 |
hasEnded() | 判断当前动画是否介绍 |
既然补间动画只能给view使用,那我们来看看view中和动画相关的几个常用方法吧
view类常用动画操作方法 | 描述 |
---|---|
startAnimation(Animation animation) | 开始动画 |
clearAnimation(Animation animation) | 取消动画 |
四、补间动画注意事项
补间动画执行后并未改变view的真实布局属性值,譬如当我们在activity中有个button在屏幕上方,我们设置平移动画后移动到屏幕下方,然后报纸动画最后执行状态保留在屏幕下方,这时如果点击屏幕下方动画执行后的button是没有任何反应的,而点击原来屏幕上方没有button的地方却响应的是点击button的事件
至此整个Android的不见动画常用属性和方法介绍完了。
Drawable动画
Drawable动画其实就是Frame动画,他允许你实现像播放幻灯片一样的效果,这种动画其实就是一张张的drawable的叠加,这种动画继承自Drawable,所以AnimationDrawable本质上还是Drawable。所以xml定义的动画一般放在res/drawable/目录下
Drawable动画的xml实现方式
Drawable动画可以使用xml或者java方式实现,但是依然推荐使用xml方式
先附上一段代码示例drawable_anim.xml
注意drawable_anim.xml 文件位于res/drawable/目录下
animation-list 必须是根节点,包含一个或者多个item元素,其属性有:
- android:oneshot=true表示只执行一次,false表示循环执行
- item 类似一帧的动画资源
item是animation-list的子项,包含属性如下:
- android:drawable 一个frame的Drawable资源。
- android:duration 一个frame显示多长时间。
然后在activity中的代码调用:
Drawable动画的代码实现方式
所谓的代码实现方式,只是把在xml中添加drawable换成了代码方式添加。
addFrame(@NonNull Drawable frame, int duration)顾名思义 增加一帧动画到动画中,第一个参数是需要添加的drawable对象,第二个参数是该动画的停留时间。
以上就是Drawable的全部知识点了。
最后有个注意事项:start()方法不能在oncreate中调用,因为AnimationDeawable还没有完全依附在window上,所以最好的调运时机是onWindowFocusChanged()方法中
该动画的内容比较少,相对简单。
属性动画
Android3.0以后引入了属性动画,所谓的属性动画其实就是修改控件的属性值而实现的动画,补间动画和drawable动画实现的效果有限,所以功能比它们要强大的多,也要复杂的多
我们先来看下属性动画的类关系:
也就是所有的属性动画的基类就是Animator,所以可以看见我们平时使用的属性动画重点就在于ValueAnimator、TimeAnimator、ObjectAnimator、AnimatorSet。
属性动画XML实现方式
同样属性动画有xml和纯代码两种实现方式,我们先来看xml的实现方式
在xml中可直接使用的属性动画节点有ValueAnimator、ObjectAnimator、AnimatorSet,而TimeAnimator不能在xml中作为节点使用,属性动画的xml文件需要放置在/res/animator/目录下,注意不是/res/anim/,/res/anim/是放置补间动画的目录。这需要区分开。
ValueAnimator 在xml中对应的是animator标签
ObjectAnimator在xml中对应的objectAnimator标签
AnimatorSet在xml中对应的是set标签
实例代码:
下面对各个属性进行分别解释
set标签属性解释:
xml属性 | 解释 |
---|---|
android:ordering | 控制动画启动顺序:sequentially动画按照先后顺序启动;together(默认):动画同时启动 |
xml属性 | 解释 |
---|---|
android:properName | String类型,必须要设置的节点属性,代表要执行动画的属性,譬如可以执行一个控件的“alpha”或者一些其他自定义的属性 |
android:valueFrom | 动画起始点,与valueTo相对,如果没有设置,则系统通过属性的get方法获取,如果是颜色的话由6位16进制的数字表示 |
android:valueTo | float、int或者color类型,必须要设置,表明动画结束的值,如果是颜色的话由6位16进制的数字表示 |
android:duration | 动画执行的时长,int类型,以毫秒为单位,默认是300毫秒 |
android:startOffset | 动画延迟的时间,从调用start()方法后开始计算,int类型,毫秒单位 |
android:repeatCount | 动画执行重复次数,int类型,“-1”表示无限循环,“1”表示执行一次也就是总共执行两次,默认为0不重复 |
android:repeatMode | 重复模式,当动画执行完的时候应该如何处理,该指必须是证书或者-1,“reverse”会使动画向相反方向执行,可实现类似钟摆的效果,“repeat”会使动画每次都从头开始循环 |
android:valueType | 有intType、floatType两种,分别说明动画值是int和float类型,如果是颜色,就不需要指定了,系统会自动处理颜色值 |
objectAnimator的属性同上
在activity中调用
|
|