目录
- 一: 动画的分类
- 二:解析
-
- 帧动画
-
- 补间动画
- 属性讲解
- interpolator插值器
-
- 属性动画
- ValueAnimator
- ObjectAnimator
-
一: 动画的分类
- 帧动画
- 补间动画
- 属性动画
二:解析
1. 帧动画
(1)定义
这些图片是将一些列的drawable组合在一起,进行连续的播放, 类似于以前电影源用胶卷进行动画播放
(2)有图有真相
(3)准备图片
看着是不是还行,哈哈,下面说一下实现,首先准备几个图片,百度吧,啥都有,还有美女动图,哈哈,准备好图片以后就开始我们的项目咯
(4)创建XML 配置文件
- 在res下创建一个drawable文件夹,在其中创建一个anim.xml
- 在
标签中将一系列的图片组合在一起
(5) 如何在代码中使用
//开始动画
private void init_startAnim() {
anim = (AnimationDrawable) getResources().getDrawable(R.drawable.anim);
img.setBackgroundDrawable(anim);//img 是我们放在布局文件中的ImageView
anim.start();
}
//停止动画
private void init_stopAnim() {
if (anim != null) {
anim.stop();
}
}
2. 补间动画
本文很多参考这篇文章,有兴趣的小伙伴,可以点击详细查看
(1) 定义
指的View可以是TextView,Button等等 可以让指定的View进行缩放,旋转,位移,透明度的变化 (对前面的4个效果可以组合实用)
(2)属性讲解
属性名称 | 作用 |
---|---|
Alpha | 透明度 |
Rotate | 旋转 |
Canle | 缩放 |
Translate | 位移 |
Set | 组合 |
先有个概念,后续会对每个属性详细讲解。。。
(3)使用
- 创建
res/anim
的文件夹 , 在anim
中定义指定标签的布局文件 - 在动态代码中加载补间动画
-
找到指定的View播放动画
anim_test中的属性
动画属性的介绍,这里很重要
(4) 属性讲解
Animaton属性讲解(上诉的动画都有这些属性,是父类)
属性名称 | 作用 | 备注 |
---|---|---|
duration | 动画执行的时间 | 以毫秒为单位 |
fillEnabled | 动画结束时,是否还原到开始动画前的状态 | true或者false |
fillBefore | 与fillEnabled相同 | 无 |
fillAfter | 动画结束时,是否将保持动画最后时的状态 | true或者false |
repeatMode | 重复类型 | reverse:表示倒序回访,restart:表示重新放一遍,这个属性必须与repeatCount联合使用,因为牵扯到重复,即重复播放时的播放类型。 |
repeatCount | 动画重复的次数 | infinite:表示无限循环 |
interpolator | 设定的插值器,它主要用来为动画设置一些特殊的效果,比方说:加速运动、减速运动、动画结束的时候弹起等等。 | 下面会详细介绍 |
alpha属性详解
属性名称 | 作用 | 备注 |
---|---|---|
fromAlpha | 动画开始时的透明度 | 变化范围为0.0-1.0,0.0表示完全透明,1.0表示完全不透明 |
toAlpha | 动画结束时的透明度 | 同上 |
rotate属性详解
属性名称 | 作用 | 备注 |
---|---|---|
fromDegrees | 动画开始时旋转的角度位置 | float类型;正值代表顺时针方向度数,负值代码逆时针方向度数 |
toDegrees | 动画结束时旋转到的角度位置 | 同上 |
pivotX | 旋转点X轴坐标 | 排版问题,请看下面的备注 |
pivotY | 旋转点Y轴坐标 | 同上 |
pivotX
:float类型,可以是数值、百分数、百分数p三种样式,比如50、50%、50%p; 当为数值时,表示在当前View的左上角,即原点处加上50px,做为旋转点X坐标,如果是50%;表示在当前控件的左上角加上自己宽度的50%做为旋转点X坐标;如果是50%p,那么就是表示在当前控件的左上角加上父控件宽度的50%做为旋转点X坐标
canle属性详解
属性名称 | 作用 | 备注 |
---|---|---|
fromXScale | 起始的X方向上相对自身的缩放比例 | 型float,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍 |
toXScale | 结尾的X方向上相对自身的缩放比例 | 类型float |
fromYScale | 起始的Y方向上相对自身的缩放比例 | 类型float |
toYScale | 结尾的Y方向上相对自身的缩放比例 | 类型float |
pivotX | 缩放起点X轴坐标 | 可以是数值、百分数、百分数p |
pivotY | 缩放起点Y轴坐标 | 取值及意义与pivotX一样 |
Translate属性详解
属性名称 | 作用 | 备注 |
---|---|---|
fromXDelta | 起始点X轴坐标 | 可以是数值、百分数、百分数p 三种样式 |
fromYDelta | 起始点Y坐标 | 同上 |
toXDelta | 结束点X坐标 | 无 |
toYDelta | 结束点Y坐标 | 无 |
Set属性详解
他没有特殊的属性,因为他的作用只是将所有属性融合在一起
例如
interpolator插值器
这篇文章对interpolator,讲解的比较深入
interpolaotor定义了动画变化的速率,它允许基础动画(alpha, scale, translate, rotate)加速,减速,重复变化等等。在补间动画中,我们一般只定义关键帧(首帧和尾帧),然后由系统自动生成中间帧,生成中间帧的这个过程可以成为“插值”。插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速等。下面是几种常见的插值器:
Interpolator对象 | 功能作用 | 属性讲解 |
---|---|---|
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator |
先加速再减速 | 无 |
AccelerateInterpolator @android:anim/accelerate_interpolator |
加速 | android:factor 浮点值,加速速率,默认为1; android:tension 浮点值,起始点后退的张力、拉力数,默认为2 |
AnticipateInterpolator @android:anim/anticipate_interpolator |
先回退一小步然后加速前进 | |
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator |
先回退一小步然后加速前进,超出终点一小步后再回到终点 | android:tension 同上; android:extraTension 浮点值,拉力的倍数,默认为1.5(2 * 1.5) |
BounceInterpolator @android:anim/bounce_interpolator |
最后阶段弹球效果 | 无 |
CycleInterpolator @android:anim/cycle_interpolator |
周期运动 | android:cycles 整数值,循环的个数,默认为1 |
DecelerateInterpolator @android:anim/decelerate_interpolator |
减速 | android:factor 浮点值,减速的速率,默认为1 |
LinearInterpolator @android:anim/linear_interpolator |
匀速 | 无 |
OvershootInterpolator @android:anim/overshoot_interpolator |
快速到达终点并超出一小步最后回到终点 | tension 浮点值,超出终点后的张力、拉力,默认为2 |
插值器的使用
animation.setInterpolator(new OvershootInterpolator());
(5)代码中如何使用补间动画
Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate);
ivGirl.startAnimation(animation);
3. 属性动画
推荐这文章,讲的真的挺好的
(1)定义
通过改变任何对象的属性,在属性改变的过程当中产生的动画 (3.0以后提出的)
比如:颜色 字体的颜色是红色 最后最后的颜色是绿色 (属性动画体现该变化效果) 更改控件的宽度高度等等,和补间动画相比他是改变了Object的属性,而补间动画不会改变View的属性
ValueAnimator
private void init_ValueAnimator() {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,100);
valueAnimator.setDuration(200);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
img.setTranslationX(value);
}
});
valueAnimator.start();
}
ObjectAnimator
private void init_ObjectAnimator() {
ObjectAnimator oa = ObjectAnimator.ofFloat(img, "rotationY", 0f, 360f);
oa.setDuration(3000);//设置时间
oa.start();// 播放动画
}