Android 动画
艾玛 小白。。。第一次写博客 。。。
前言
1 动画是android中的基本知识
2 本文主要系统的归纳android动画的种类 及其简单实现
3 本文涉及的代码采用kotlin实现
动画分类
android动画分类
一 、帧动画(Frame Animation)
帧动画是一帧帧的显示动画效果。
实例:
- 在res/drawable下创建一个frameanim.xml
frameAnimation布局
- 设置显示动画页面的布局,添加两个按钮用来开始和结束动画
- 在activity中加载动画
启动和关闭帧动画
到此就简单的实现了一个帧动画
二、补间动画(bween Animation)
补间动画有很多种类:AlphaAnimation(透明度动画)、RotateAnimation(旋转…)、ScaleAnimation(缩放…)、TranslateAnimation(平移…)
可以通过kotlin代码或直接部署xml布局这两种方式实现补间动画,下面针对每种动画分两种实现方式给出实例。
1、kotlin代码实现
1.1 AlphaAnimation
1.2 RotateAnimation
1.3 ScaleAnimation
在设置动画的时候可以通过setAnimationListener设置对动画的监听
1.4 TranslateAnimation
从上面代码可以看出通过kotlin代码实现补间动画都通过将对应类型的动画放入AnimationSet,然后通过view.startAnimation()将动画显示在view视图上。
补间动画的通用操作有:
setDuration(long durationMills) 设置动画持续时间(单位:毫秒)
setFillAfter(Boolean fillAfter) 如果fillAfter的值为true,则动画执行后,控件将停留在执行结束的状态
setFillBefore(Boolean fillBefore) 如果fillBefore的值为true,则动画执行后,控件将回到动画执行之前的状态
setStartOffSet(long startOffSet) 设置动画执行之前的等待时间
setRepeatCount(int repeatCount) 设置动画重复执行的次数
2、通过设置xml布局设置补间动画
由于补间动画都是通过AnimationSet进行显示,不同补间动画放入同一个xml。在res/anim下新建bweenanim.xml,其布局如下:
这里可以放置一种动画,也可以同时加入多种,可以单独设置动画的interpolator,也可以设置为统一的interpolator。然后在activity中通过AnimationUtils加载动画,代码如下:
这样当点击相应按钮是就可以显示及多种补间动画于一身的补间动画效果
三、动态动画(DynamicAnimation)
动态动画分为FlingAnimation和SpringAnimation两种,其原理基于物理物体运动,FlingAnimation的效果相当于物体在有摩擦力作用下的直线运动,SpringAnimation的效果相当于物体在有阻尼作用下的弹性运动(我的理解,感觉很粗糙)下面将会一一讲解。使用DynamicAnimation需要在项目的gradle中添加 implementation “com.android.support:support-dynamic-animation:28.0.0-alpha1”
1、FlingAniamtion
1.1、一个实例:
这个实例实现一个投掷的平移动画,同理可以实现缩放、旋转、透明度改变的动画。看一下FlingAnimation的构造函数:
参数1——object需要我们传入一个展示动画的视图,参数2——即动画属性,DynamicAnimation提供了一下几种属性:
通过设置不同的属性可以实现平移、缩放、旋转、透明度改变等不同的动画。
FlingAnimation与补间动画不同的是,动画的值的改变不是通过为动画设置interplator来实现,而是通过设置其内部类DragForce的变量Friction(类似物理运动中的摩擦力)来实现。我们在设置动画的friction时,可以合理设置其值,值越大动画值的改变速率越大
1.2 一个有趣的动画实例
由于FlingAnimation实例化时可以设置开始速度,即setStartVelocity(),所以可以通过手势监听OnFling()获取视图的初始速度,设置平移动画,从而实现视图被抛出去的效果。
手势监听通过GestureDetector设置手势监听实现,具体不写了,其中监听的OnFling实现如下:
以上代码实现了视图向拖动方向投掷的动画效果。
2 SpringAnimation
2.1 一个实例
和FlingAnimation一样,SpringAnimation也可以实现平移、缩放、旋转、透明度改变等不同的动画。看一下SpringAnimation的构造函数:
参数1——展示动画的视图,参数2——动态动画的属性(FlingAnimation中已经说过)参数3——动画的终止位置(当然也可以不设置,此处只展示了一个构造函数),可以通过传入不同的动画属性实现不同的动画。
与FlingAnimation改变动画值的机制不同,SpringAnimation类包含一个内部类SpringForce,SpringForce提供了设置DampingRatio(类似弹性运动的阻尼)和Stiffness(类似弹簧的刚度)的接口,在定制动画时可以通过setSpring()定制SpringForce,实现动画值的改变。
四、属性动画 (PropertyAnimation)
由于帧动画、补间动画、及动态动画均是基于视图的动画,有的时候我们需要针对视图的某个属性(如一个button的颜色;一张图片的大小)设置动画,以上三种动画皆不能很好地实现。
属性动画不仅可以定制视图的属性还可以作用于非视图对象,除了基本的旋转、平移、缩放、透明度四种动画外还可以实现如颜色变化等其他动画效果。
下面通过属性动画的分类,动画工作流程,并列举几个小实例来具体说明下属性动画。
1 、分类
PropertyAnimation分为ValueAnimator和ObjectAnimator两大类
其中属性动画有三个重要方法,不同的方法对应不同的估值器
ValueAnimator.ofInt(int values)
ValueAnimator.ofFloat(float values)
ValueAnimator.ofObject(int values)
以下是ValueAnimation的工作流程
ObjectAnimation的工作流程:
与ValueAnimation不同ObjectAnimation在每一次动画更新时,不需要手动赋值,但是前提是该对象具有get和set方法。
2、三个实例
2.1 使用默认估值器的ValueAnimation实现图片的尺寸动态改变
2.2 使用自定义估值器的ValueAnimation实现图片尺寸的动态变化
(1)创建一个描述属性的类:
class ImgPropterty(w: Float, h: Float) {
public var width: Float
public var height: Float
init {
width = w
height = h
}
}
(2)编写自定义估值器(估值器实现属性类的具体数值变换):
class MyObjectEvaluater : TypeEvaluator {
override fun evaluate(p0: Float, p1: ImgPropterty?, p2: ImgPropterty?): ImgPropterty {
var starObject = p1
var endObject = ImgPropterty(0f, 0f)
endObject.width = starObject!!.width + p0 * (p2!!.width - p1!!.width)
endObject.height = starObject.height + p0 * (p2.height - p1.height)
Log.i(“fraction”, p0.toString())
return endObject
}
}
(3)使用ValueAnimator.ofObject()实例化数值动画类
2.3 使用ObjectAnimation实现图片透明度动画
上面代码中参数1可以自定义对象,参数2针对视图对象还包括rotation、scale、translation属性,也可以自定义属性如color(偷懒没写),但是必须提供get,set函数。