android 动画详解
来源:互联网 发布:购买域名的网站 编辑:程序博客网 时间:2024/06/14 04:40
工作一年了 ,用的动画也不少,但是没有总结过关于动画的知识,今天可以总结一下,
首先 动画分为三种
- View Animation 补间动画
- Drawable Animation 帧动画
- Property Animation 属性动画
今天我主要总结一下补间动画和属性动画的用法。
一:补间动画
动画效果有:AlphaAnimation(透明), ScaleAnimation(伸缩) ,RotateAnimation(旋转), TransLateAnimation(平移); 有时候我们希望一种动画:既有透明,又有伸缩等效果,我们可以通过AnimationSet(集合) 动画集合的方式来实现。这五种效果不仅补间动画有,属性动画也有。
首先看下补间动画效果共有的属性值:
duration 动画持续时间,单位:msfillAfter 动画结束时是否保持最后状态fillBefor 动画金额术后是否恢复到原始状态fillEnabled 同上interpolator 设置插值器(设定动画效果,譬如回弹等)repeatCount 重复的次数repeatMode 重复的类型(1:reverse 从尾部重复;2:restart 重头重复)startOffSet 调用start开启动画之后,等待的运行时间,相当于动画sleep时间之后,在自动开启start;
接下来说一下每种动画效果的私有属性:
AlphaAnimation私有属性:
fromAlpha 动画开始透明度(0.0到1.0; 1.0是不透明,0.0是全透明)toAlpha 动画结束的透明度
RotateAnimation 私有属性:
fromDegrees 旋转开始角度(正代表顺时针度数,负代表逆时针读数)toDegrees 旋转结束角度
ScaleAnimation 私有属性
fromXScale 初始X轴伸缩比例 (1.0表示无变化)toXScale 结束X轴伸缩比例 fromYScale 初始Y轴伸缩比例 1.0表示无变化toYScale 结束Y轴伸缩比例
TranslateAnimation 私有属性
fromXDelta 起始点X轴坐标toXDelta 终点X轴坐标fromYDelat 起始点Y轴坐标toYDelta 终点Y轴坐标
关于AnimationSet集合效果,注意一点就行,AnimationSet继承自Animation类;当对AnimationSet设置属性时, 该容器下的所有动画效果都会受影响!
下面说几个常用的Animation类的方法:
reset 重置Animation初始化cancel 开始Animation动画start 开始Animation动画setAnimationListener 给当前Animation设置动画监听hasStarted 判断当前Animation是否开始hasEnded 判断当前Animation是否结束
关于补间动画理论知识点还有一点需要注意:
补间动画执行之后,改变的是view的状态,而不是其属性,也就是说,当我们移动一个Button,并保持结束后的状态,当我们此时点击Button时,是不会触发OnClick事件的,当我们点击原始Button位置时,会触发onLick事件的。 此时如果我们需要点击Button改变后的位置而出发Onclick事件, 此时我们需要手动改变button的属性值!
由于补间动画我们平时用的不多,再次我只讲述一下属性动画的XML用法:
首先我们在res/anim/ 文件夹下创建一个名为tet_view_animation的Xml。(如果没有anim文件夹是需要自己创建的)
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:interpolator="@android:anim/bounce_interpolator" android:fillAfter="true"> <translate android:fromXDelta="0" android:toXDelta="200" android:fromYDelta="0" android:toYDelta="200" android:repeatCount="-1" android:repeatMode="reverse"> </translate> <!--<rotate--> <!--android:fromDegrees="0"--> <!--android:toDegrees="50"--> <!--android:repeatCount="-1"--> <!--android:repeatMode="reverse"/>--> <scale android:fromXScale="0" android:toXScale="1" android:fromYScale="0" android:toYScale="1" android:repeatCount="-1" android:repeatMode="reverse"/> <alpha android:fromAlpha="0" android:toAlpha="1" android:repeatCount="-1" android:repeatMode="reverse"/></set>
可以看到, 我创建了一个动画集合,然后动画无限重复(repeatCount=”-1”) ,由于repeatCount和repeatMode是共有的属性,那么为什么repeatCount和repeatMode不设置在set集合里呢?
这是因为在AnimationSet集合里设置repeatCount和repeatMode是无效的,应该设置在集合内部的动画中!这一点是值得注意的。
然后就是代码引用了:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.test_view_animation);textView.startAnimation(animation);
这样我们的动画就会无限的循环了。
二:属性动画
关于属性动画,这是我们在项目中经常用到的动画,属性动画基本可以替代补间动画。属性动画是改变view的属性值,比如:当我们改变一个Button之后,点击改变之后位置的Button,会触发onclick事件的。
属性动画常用的实现类:
ValueAnimator 在一个特定时间里执行一个动画TimeAnimator 时序监听回调工具ObjectAnimator 一个对象的一个属性动画AnimatorSet 动画集合
其中TimeAnimator和ObjectAnimator都继承自ValueAnimator类;
AnimatorSet属性:
ordering:控制子动画启动的先后顺序。(sequentilally 子动画按照定义的先后顺序先后执行;together(默认):动画同时启动)
ValueAnimator属性:
valueTo:float int 或者color类型,必须要设置的节点属性,表明动画结束的点,如果是颜色,设置成6位十六进制的数字表示valueFrom:相对应valueTo, 动画的起始点,如果没有指定,系统会通过属性的get方法获取。duration:动画时长,int类型,单位:ms 默认300毫秒;startOffset:动画延迟时间,从调用start方法后开始计算 单位:msrepeatCount:一个动画重复的次数,int型, "-1"表示无限循环 repeatMode:重复的方式valueType:关键参数,如果该value是一个颜色,那么就不需要制定,因为动画框架会自动处理颜色值。
ObjectAnimator属性同上。
与补间动画一样,属性动画也有平移,旋转,伸缩,透明等效果的动画。补间动画的共有属性,属性动画也是有的,在此不再赘述。
关于插值器附上以下几种:
AccelerateDecelerateInterolator:先加速后减速。AccelerateInterpolator:加速。DecelerateInterpolator:减速。AnticipateInterpolator:先向相反方向改变一段再加速播放。AnticipateOvershootInterpolator:先向相反方向改变,再加速播放,会超出目标值然后缓慢移动至目标值,类似于弹簧回弹。BounceInterpolator:快到目标值时值会跳跃。CycleIinterpolator:动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)。LinearInterpolator:线性均匀改变。OvershottInterpolator:最后超出目标值然后缓慢改变到目标值。
下面介绍两种定义属性动画的三种方式:
1:XML定义
首先在res/animator/ 目录下创建property_layout.xml,然后代码如下:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> <objectAnimator android:propertyName="translationX" android:repeatMode="reverse" android:repeatCount="-1" android:valueFrom="0dp" android:valueTo="200dp"/> <objectAnimator android:propertyName="translationY" android:repeatMode="reverse" android:repeatCount="-1" android:valueFrom="0dp" android:valueTo="200dp"/> <objectAnimator android:propertyName="rotation" android:repeatMode="reverse" android:repeatCount="-1" android:valueFrom="0" android:valueTo="360" android:pivotX="50%" android:pivotY="50%"/></set>
可以看到我在每个子动画里面都设置了repeatMode和repeatCount;
然后在代码中引用该XML
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.property_layout);set.setTarget(textView);set.setDuration(2000);set.start();
setTarget也就是将动画绑定在view上。
2:代码创建AnimatorSet集合,代码如下:
ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(textView, "translationX", 0, 200);objectAnimatorX.setRepeatCount(-1);objectAnimatorX.setRepeatMode(ValueAnimator.REVERSE);ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(textView, "translationY", 0, 200);objectAnimatorY.setRepeatMode(ValueAnimator.REVERSE);objectAnimatorY.setRepeatCount(-1);ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(textView, "rotation",0,360);rotateAnimator.setRepeatCount(-1);rotateAnimator.setRepeatMode(ValueAnimator.REVERSE);final AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(2000);animatorSet.play(objectAnimatorX).with(objectAnimatorY).with(rotateAnimator);//animatorSet.setInterpolator(new BounceInterpolator());animatorSet.start();
注意:上面的”translationX”,”translationY”,”rotation”字符串不能拼错,在项目中,可以将下述的字符串封装在常量类里
"translationX" X轴平移"translationY" Y轴平移"rotation" 旋转"alpha" 透明度"scaleX" X轴伸缩"scaleY" Y轴伸缩
3:代码创建ObjectAnimator,开启动画
这种方法我自己用的不多,代码如下:
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0f, 1f);//透明度PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 0, 200);//平移PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", 0, 200);PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.5f, 1);//伸缩PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.5f, 1);PropertyValuesHolder rotate = PropertyValuesHolder.ofFloat("rotation", 0, 360);//旋转ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(textView,alpha, translationX,translationY,scaleX,scaleY,rotate);objectAnimator.setRepeatCount(-1);//重复次数设置为无限循环objectAnimator.setRepeatMode(ValueAnimator.REVERSE);//设置循环模式 倒着循环objectAnimator.setDuration(2000);//设置动画执行时间objectAnimator.setInterpolator(new BounceInterpolator());//设置插值器objectAnimator.start();
可以注意到:使用这个方法,只用设置一次repeatMode和repeatCount。
最后附上demo源码地址:
http://download.csdn.net/detail/lmq121210/9913849
- android动画 属性动画详解
- Android 动画框架详解
- Android 动画框架详解
- Android 动画框架详解
- Android开机动画详解
- Android 动画框架详解
- Android-动画详解
- Android 动画框架详解
- Android中的动画详解
- android动画详解
- Android 动画框架详解
- Android 动画框架详解
- Android 动画框架详解
- Android 动画框架详解
- Android动画TranslateAnimation详解
- Android 动画框架详解
- Android 动画框架详解
- android 动画详解
- 中国剩余定理
- 微信公众号开发--接收与回复消息(Java)
- 前端跨域的问题
- cacheUtils
- 状态选择器及Button形状
- android 动画详解
- angularjs指令中的compile与link函数详解
- 关于字典表与实例表的思考
- vue指令大全
- Leetcode84. Largest Rectangle in Histogram.
- Master: Error: JAVA_HOME is not set and could not be found.
- 事物的五种隔离级别
- xxxx
- MyEclipse修改项目url访问路径的问题