Android动画系列|Android动画篇(二)—— 代码实现alpha、scale、translate、rotate、set及插值器动画
前言:只有比牛人跑得更快,才有可能追上他的脚步一、概述 这篇将为大家讲述如何使用代码动态生成动画以及插值器。先简单列出各个便签对应的类,方便大家理解:
scale | ScaleAnimation | 渐变尺寸伸缩动画效果 |
alpha | AlphaAnimation | 渐变透明动画效果 |
rotate | RotateAnimation | 画面转移旋转动画效果 |
translate | TranslateAnimation | 画面转移位置移动动画效果 |
set | AnimationSet | 动画集合 |
- android:durationsetDuration(long)动画持续时间,以毫秒为单位
- android:fillAftersetFillAfter(boolean)如果设置为true,控件动画结束时,将保持动画最后时的状态
- android:fillBeforesetFillBefore(boolean)如果设置为true,控件动画结束时,将还原到动画开始时的状态
- android:fillEnabledsetFillEnabled(boolean)效果与fillBefore一致
- android:repeatCountsetRepeatCount(int)重复次数,如果设置为infinite,则表示无限重复
- android:repeatModesetRepeatMode(int)重复类型,有reverse和restart两个值,取值为REVERSE和RESTART,必须与repeatCount一起使用才能看到效果,因为这里是重复的类型
- android:interpolatorsetInterpolator(Interpolator)插值器,其实就是指定的动作效果,比如弹跳,加速等
三、ScaleAnimation 1、自身属性
在Scale标签中,它有几个自身属性,这部分的属性都是在scaleAnimation构造函数中添加的,我们来展示一下:
- android:fromXScale起始X方向相对自身的缩放比例,浮点值,比如1.0表示无变化,0.5表示缩小一倍,2.0表示放大一倍
- android:toXScale结尾X方向相对自身的缩放比例,浮点值;
- android:fromYScale起始Y方向相对自身的缩放比例,浮点值;
- android:toYScale结尾Y方向相对自身的缩放比例,浮点值;
- android:pivotX缩放起点X轴坐标,有数值,百分数,百分数p三种,比如:50,50%,50%p;当为数值时,表示当前view左上角,即原点处加上50px,作为起点缩放点X轴坐标;当为百分比时,表示当前view的左上角加上该控件宽的50%作为缩放起点X轴坐标;当为50%p时,表示当前view的左上角加上父控件宽度50%作为缩放起点X轴坐标;
- android:pivotY缩放起点Y轴坐标,意义同上(如果有不理解的可参考我的第一篇文章《Android动画篇(一)》)
- ScaleAnimation(Context context, AttributeSet attrs)从xml文件中加载动画,基本用不到
- ScaleAnimation(float fromX, float toX, float fromY, float toY)
- ScaleAnimation(float fromX, float toX, float fromY, float toY,float pivotX, float pivotY)
- ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
标签属性android:pivotX有三种取值,数值,百分数,百分数p,这个是关系到缩放起点的取值;体现在构造函数中,就是最后一个构造函数的pivotXType,它的取值有三种,Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;
android:pivotX的数值对应Animation.ABSOLUTE,百分数对应Animation.RELATIVE_TO_SELF,百分数p对应Animation.RELATIVE_TO_PARENT;
3、代码使用
//初始化缩放动画对象
ScaleAnimation scaleAnimation = new ScaleAnimation(0f, 2f, 0f, 2f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
//设置动画时间
scaleAnimation.setDuration(700);
//设置动画结束后还原动画开始前的状态
scaleAnimation.setFillBefore(true);
//控件使用动画
mTextView.startAnimation(scaleAnimation);
效果如下:
文章图片
四、AlphaAnimation 1、自身属性
- android:fromAlpha动画开始的透明度,取值范围0.0-1.0,0.0表示完全透明,1.0表示完全不透明
- android:toAlpha动画结束的透明度,同上
- AlphaAnimation(Context context, AttributeSet attrs)同样的,从本地xml文件加载动画,基本不使用
- AlphaAnimation(float fromAlpha, float toAlpha)
//初始化透明度动画对象,传入开始和结束的透明度值
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
//设置动画时长2秒
alphaAnimation.setDuration(2000);
//设置动画结束后还原动画最开始时的状态
alphaAnimation.fillBefore(true);
//控件启动动画
mTextView.startAnimation(alphaAnimation);
效果如下:
文章图片
五、RotateAnimation 1、自身属性
- android:fromDegrees开始旋转的角度度数,正值表示顺时针方向度数,负值表示逆时针方向度数
- android:toDegrees结束旋转时的角度度数,正值表示顺时针方向度数,负值表示逆时针方向度数
- android:pivotX缩放起点X轴坐标,可以是数值,百分比,百分比p,比如50,50%,50%p,含义已经在scale标签中讲述,这里就不多描述了
- android:pivotY缩放起点Y轴的坐标,同上
- RotateAnimation(Context context, AttributeSet attrs)从本地xml文件中加载动画,基本不用
- RotateAnimation(float fromDegrees, float toDegrees)
- RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
- RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
3、代码使用
RotateAnimation rotateAnimation = new RotateAnimation(0f, -650f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(2000);
rotateAnimation.setFillAfter(true);
mTextView.startAnimation(rotateAnimation);
效果如下:
文章图片
六、TranslateAnimation 1、自身属性
- android:fromXDelta起始点的X轴坐标,可以是数值,百分数,百分数p,比如50,50%,50%p ;具体意义已经在scale标签中讲述,这里就不再重复讲了;
- android:fromYDelta起始点Y轴坐标,同上
- android:toXDelta结束点X轴坐标,同上
- android:toYDelta结束点Y轴坐标,同上
- TranslateAnimation(Context context, AttributeSet attrs)从本地xml文件中加载动画,基本不用
- RotateAnimation(float fromDegrees, float toDegrees)
- TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
- TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
3、代码使用
TranslateAnimation translateAnimation = new TranslateAnimation(0, 100, 0, 100);
translateAnimation.setDuration(2000);
//设置重复次数,INFINITE表示无限重复
translateAnimation.setRepeatCount(Animation.INFINITE);
//设置重复类型,每次重复都重新开始动画
translateAnimation.setRepeatMode(Animation.RESTART);
mTextView.startAnimation(translateAnimation);
效果如下:
文章图片
七、AnimationSet 1、自身属性
AnimationSet类对用Set便签,定义动作类的合集,他自己是没有xml属性的,但是它具有Animation工具类的属性,具体已经在上面的Animation公共类中做了讲述,就不解释了,这里讲述一下他的常用的几个函数:
- addAnimation(Animation a)增加动画
- setStartOffset(long)延时启动动画,时间单位为毫秒
- cancel()退出动画 在动画不需要的时候退出动画
- reset()释放资源
- setAnimationListener(AnimationListener listener)设置动画监听,它有三个函数回调,分别监听动画开始,结束,重复(下面会讲到)
2、构造函数
- AnimationSet(Context context, AttributeSet attrs)基本不用
- AnimationSet(boolean shareInterpolator)shareInterpolator取值true和false,当为true时,指在animationSet中指定一个插值器,它下面的动画都使用这个插值器;如果设置为false,则它下面的动画使用自己定义的插值器。
ScaleAnimation scale = new ScaleAnimation(0.0f, 1.5f, 0.0f, 1.5f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scale.setRepeatMode(Animation.REVERSE);
scale.setRepeatCount(Animation.INFINITE);
AlphaAnimation alpha = new AlphaAnimation(0.2f, 0.8f);
alpha.setRepeatCount(Animation.INFINITE);
alpha.setRepeatMode(Animation.REVERSE);
RotateAnimation rotate = new RotateAnimation(0f,
360f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotate.setRepeatMode(Animation.RESTART);
rotate.setRepeatCount(Animation.INFINITE);
TranslateAnimation translate = new TranslateAnimation(Animation.ABSOLUTE,
0,
Animation.ABSOLUTE, 300, Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 300);
translate.setRepeatCount(Animation.INFINITE);
translate.setRepeatMode(Animation.REVERSE);
//构建动画合集
AnimationSet animationSet = new AnimationSet(true);
//设置动画合集重复的次数,在AnimationSet设置是无效的
//animationSet.setRepeatCount(6);
//设置动画合集重复类型,优先使用AnimationSet设置的,如果AnimationSet没有设置
则使用子动画中的
//animationSet.setRepeatMode(Animation.RESTART);
//添加动画
animationSet.addAnimation(scale);
animationSet.addAnimation(alpha);
animationSet.addAnimation(rotate);
animationSet.addAnimation(translate);
//设置动画合集时间,如果animationSet中有设置则使用animationSet中设置的时长,否
则使用子动画中的时长
animationSet.setDuration(1000);
//设置动画合集结束时保持动画最后的状态,只animationSet中设置有效,如果
animationSet中没有设置,则使用默认的setFillBefore(true)
animationSet.setFillAfter(true);
//设置动画集合监听
animationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.e(TAG, "Set:onAnimationStart");
}@Override
public void onAnimationEnd(Animation animation) {
Log.e(TAG, "Set:onAnimationEnd");
}@Override
public void onAnimationRepeat(Animation animation) {
Log.e(TAG, "Set:onAnimationRepeat");
}
});
//退出动画
//animationSet.cancel();
//animationSet.reset();
mTextView.startAnimation(animationSet);
如图:
文章图片
注意:如果将部分动画添加到AnimationSet中
- 在AnimationSet中设置setRepeatCount()是无效的,只能在子动画中设置重复次数才有效果。
- 对于setDuration()和setRepeatMode()则优先使用AnimationSet中设置的属性,如果AnimationSet中没有设置就使用子控件中的(AnimationSet没有设置动画时长,子动画一定要设置时长)。
- setFillAfter()或者setFillBefore()属性只能在AnimationSet中设置,如果没有设置则使用默认的setFillBefore(true),在子动画中设置是无效的。
八、监听器 animation.setAnimationListener设置动画监听,这个是Animation基类的属性,所有子类动画都有这个监听
/**
* 监听动画变化时三个状态
*/
public static interface AnimationListener {void onAnimationStart(Animation animation);
void onAnimationEnd(Animation animation);
void onAnimationRepeat(Animation animation);
}
在AnimationListener中主要是监听三个状态,start、end、repeat;动画开始会调用onAnimationStart(Animation animation)方法,动画结束会调用onAnimationEnd(Animation animation)方法,动画重复执行会调用onAnimationRepeat(Animation animation)方法。
文章图片
九、插值器 Interpolator是Animation类的一个xml属性,所以scale、rotate、alpha、translate、set都会继承得到这个属性。
Interpolator的系统值有下面几个:
Interpolator class | ResourceID | |
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator | 在动画开始和结束的时候比较慢,中间比较快 |
AccelerateInterpolator | @android:anim/accelerate_interpolator | 动画开始时比较慢,然后加速 |
AnticipateInterpolator | @android:anim/anticipate_interpolator | 开始的时候向后然后向前甩 |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator | 开始的时候向后然后向前甩一定值后返回最后的值 |
BounceInterpolator | @android:anim/bounce_interpolator | 动画结束的时候弹起 |
CycleInterpolator | @android:anim/cycle_interpolator | 动画循环播放特定的次数,速率改变沿着正弦曲线 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 在动画开始的地方快然后慢 |
LinearInterpolator | @android:anim/linear_interpolator | 以常量速率改变 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 向前甩一定值后再回到原来位置 |
TranslateAnimation translateAnim = new TranslateAnimation(0, 300, 0, 300);
translateAnim.setDuration(1000);
//设置插值器
translateAnim.setInterpolator(new BounceInterpolator());
mTextView.startAnimation(translateAnim);
这里仅仅演示位移时的插值器效果,其他的就不一一演示了,效果如下:
文章图片
至此,本文结束!
源码下载地址:https://github.com/FollowExcellence/AndroidAnimation
请大家尊重原创者版权,转载请标明出处:https://blog.csdn.net/m0_37796683/article/details/90376533 谢谢!
动画系列文章:
1、 Android动画篇(一)—— alpha、scale、translate、rotate、set的xml属性及用法
2、Android动画篇(二)—— 代码实现alpha、scale、translate、rotate、set及插值器动画
- 补间动画的XML用法以及属性详解
3、 Android动画篇(三)—— 属性动画ValueAnimator的使用
- 代码动态实现补间动画以及属性详解
4、 Android动画篇(四)—— 属性动画ValueAnimator的高级进阶
- ValueAnimator的基本使用
5、 Android动画篇(五)—— 属性动画ObjectAnimator基本使用
- 插值器(Interpolator)、计算器(Evaluator)、ValueAnimator的ofObject用法等相关知识
6、 Android动画篇(六)—— 组合动画AnimatorSet和PropertyValuesHolder的使用
- ObjectAnomator的基本使用以及属性详解
【Android动画系列|Android动画篇(二)—— 代码实现alpha、scale、translate、rotate、set及插值器动画】以上几篇动画文章是一定要掌握的,写的不好请多多指出!
- AnimatorSet动画集合和PropertyValuesHolder的使用
推荐阅读
- #|阿尔法点亮LED灯(一)汇编语言
- Android属性动画上手实现各种动画效果,自定义动画,抛物线等
- android动画系列|Android动画之AnimatorSet联合动画用法
- android动画系列|Android动画之ValueAnimator用法和自定义估值器
- android动画系列|Android动画之ObjectAnimator中ofXX函数全解析-自定义Property,TypeConverter,TypeEvaluator
- 记一次小白之路使用AndroidViewAnimations 安卓抖动动画
- Android|Android Alpha 更改图片透明度
- Android动画|Android动画-属性动画-ViewPropertyAnimator
- Android动画篇(三)—— 属性动画ValueAnimator的使用