当前位置: 首页 > news >正文

怎么样做移动油光文字网站专做it招聘的网站

怎么样做移动油光文字网站,专做it招聘的网站,网站代理公司,网站做友链盈利转自#xff1a;工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀#xff0c;分析的同时也要整理归纳基础知识#xff0c;刚好有人微博私信让全面说说Android的动画#xff0c;所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考… 转自工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀分析的同时也要整理归纳基础知识刚好有人微博私信让全面说说Android的动画所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考Android Developer。 Android系统提供了很多丰富的API去实现UI的2D与3D动画最主要的划分可以分为如下几类 View Animation 视图动画在古老的Android版本系统中就已经提供了只能被用来设置View的动画。 Drawable Animation 这种动画也叫Frame动画、帧动画其实可以划分到视图动画的类别专门用来一个一个的显示Drawable的resources就像放幻灯片一样。 Property Animation 属性动画只对Android 3.0API 11以上版本的Android系统才有效这种动画可以设置给任何Object包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的可以让你自定义任何类型和属性的动画。 可以看见当前应用程序开发涉及的主要动画也就这三大类我们接下来以类别为基础来慢慢展开说明。 2 View Animation视图动画使用详解 2-1 视图动画概述 视图动画也叫Tween补间动画可以在一个视图容器内执行一系列简单变换位置、大小、旋转、透明度。譬如如果你有一个TextView对象您可以移动、旋转、缩放、透明度设置其文本当然如果它有一个背景图像背景图像会随着文本变化。 补间动画通过XML或Android代码定义建议使用XML文件定义因为它更具可读性、可重用性。 如下是视图动画相关的类继承关系 java类名 xml关键字 描述信息 AlphaAnimation alpha 放置在res/anim/目录下 渐变透明度动画效果 RotateAnimation rotate 放置在res/anim/目录下 画面转移旋转动画效果 ScaleAnimation scale 放置在res/anim/目录下 渐变尺寸伸缩动画效果 TranslateAnimation translate 放置在res/anim/目录下 画面转换位置移动动画效果 AnimationSet set 放置在res/anim/目录下 一个持有其它动画元素alpha、scale、translate、rotate或者其它set元素的容器 通过上图和上表可以直观的看出来补间动画的关系及种类了吧接下来我们就详细一个一个的介绍一下各种补间动画。 2-2 视图动画详细说明 可以看出来Animation抽象类是所有补间动画类的基类所以基类会提供一些通用的动画属性方法如下我们就来详细看看这些属性 2-2-1 Animation属性详解 xml属性 java方法 解释 android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行 android:duration setDuration(long) 动画持续时间毫秒为单位 android:fillAfter setFillAfter(boolean) 控件动画结束时是否保持动画最后的状态 android:fillBefore setFillBefore(boolean) 控件动画结束时是否还原到开始动画前的状态 android:fillEnabled setFillEnabled(boolean) 与android:fillBefore效果相同 android:interpolator setInterpolator(Interpolator) 设定插值器指定的动画效果譬如回弹等 android:repeatCount setRepeatCount(int) 重复次数 android:repeatMode setRepeatMode(int) 重复类型有两个值reverse表示倒序回放restart表示从头播放 android:startOffset setStartOffset(long) 调用start函数之后等待开始运行的时间单位为毫秒 android:zAdjustment setZAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置top/bottom/normal默认为normal 也就是说无论我们补间动画的哪一种都已经具备了这种属性也都可以设置使用这些属性中的一个或多个。 那接下来我们就看看每种补间动画特有的一些属性说明吧。 2-2-2 Alpha属性详解 xml属性 java方法 解释 android:fromAlpha AlphaAnimation(float fromAlpha, …) 动画开始的透明度0.0到1.00.0是全透明1.0是不透明 android:toAlpha AlphaAnimation(…, float toAlpha) 动画结束的透明度同上 2-2-3 Rotate属性详解 xml属性 java方法 解释 android:fromDegrees RotateAnimation(float fromDegrees, …) 旋转开始角度正代表顺时针度数负代表逆时针度数 android:toDegrees RotateAnimation(…, float toDegrees, …) 旋转结束角度正代表顺时针度数负代表逆时针度数 android:pivotX RotateAnimation(…, float pivotX, …) 缩放起点X坐标数值、百分数、百分数p譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点 android:pivotY RotateAnimation(…, float pivotY) 缩放起点Y坐标同上规律 2-2-4 Scale属性详解 xml属性 java方法 解释 android:fromXScale ScaleAnimation(float fromX, …) 初始X轴缩放比例1.0表示无变化 android:toXScale ScaleAnimation(…, float toX, …) 结束X轴缩放比例 android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y轴缩放比例 android:toYScale ScaleAnimation(…, float toY, …) 结束Y轴缩放比例 android:pivotX ScaleAnimation(…, float pivotX, …) 缩放起点X轴坐标数值、百分数、百分数p譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点 android:pivotY ScaleAnimation(…, float pivotY) 缩放起点Y轴坐标同上规律 2-2-5 Translate属性详解 xml属性 java方法 解释 android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始点X轴坐标数值、百分数、百分数p譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点 android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始点Y轴从标同上规律 android:toXDelta TranslateAnimation(…, float toXDelta, …) 结束点X轴坐标同上规律 android:toYDelta TranslateAnimation(…, float toYDelta) 结束点Y轴坐标同上规律 2-2-6 AnimationSet详解 AnimationSet继承自Animation是上面四种的组合容器管理类没有自己特有的属性他的属性继承自Animation所以特别注意当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。 2-3 视图动画使用方法 通过上面对于动画的属性介绍之后我们来看看在Android中这些动画如何使用PS这里直接演示xml方式至于java方式太简单了就不说了如下 上面就是一个标准的使用我们定义的补间动画的模板。至于补间动画的使用Animation还有如下一些比较实用的方法介绍 Animation类的方法 解释 reset() 重置Animation的初始化 cancel() 取消Animation动画 start() 开始Animation动画 setAnimationListener(AnimationListener listener) 给当前Animation设置动画监听 hasStarted() 判断当前Animation是否开始 hasEnded() 判断当前Animation是否结束 既然补间动画只能给View使用那就来看看View中和动画相关的几个常用方法吧如下 ?xml version1.0 encodingutf-8? set xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:interpolator[package:]anim/interpolator_resourceandroid:shareInterpolator[true | false] alphaandroid:fromAlphafloatandroid:toAlphafloat /scaleandroid:fromXScalefloatandroid:toXScalefloatandroid:fromYScalefloatandroid:toYScalefloatandroid:pivotXfloatandroid:pivotYfloat /translateandroid:fromXDeltafloatandroid:toXDeltafloatandroid:fromYDeltafloatandroid:toYDeltafloat /rotateandroid:fromDegreesfloatandroid:toDegreesfloatandroid:pivotXfloatandroid:pivotYfloat /set.../set /set ImageView spaceshipImage (ImageView) findViewById(R.id.spaceshipImage); Animation hyperspaceJumpAnimation AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation);View类的常用动画操作方法 解释 startAnimation(Animation animation) 对当前View开始设置的Animation动画 clearAnimation() 取消当View在执行的Animation动画 到此整个Android的补间动画常用详细属性及方法全部介绍完毕如有特殊的属性需求可以访问Android Developer查阅即可。如下我们就来个综合大演练。 2-4 视图动画注意事项 关于视图动画补间动画的例子我就不介绍了网上简直多的都泛滥了。只是强调在使用补间动画时注意如下一点即可 特别特别注意补间动画执行之后并未改变View的真实布局属性值。切记这一点譬如我们在Activity中有一个Button在屏幕上方我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方这时如果点击屏幕下方动画执行之后的Button是没有任何反应的而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。 2-5 视图动画Interpolator插值器详解 2-5-1 插值器简介 介绍补间动画插值器之前我们先来看一幅图如下 可以看见其实各种插值器都是实现了Interpolator接口而已同时可以看见系统提供了许多已经实现OK的插值器具体如下 java类 xml id值 描述 AccelerateDecelerateInterpolator android:anim/accelerate_decelerate_interpolator 动画始末速率较慢中间加速 AccelerateInterpolator android:anim/accelerate_interpolator 动画开始速率较慢之后慢慢加速 AnticipateInterpolator android:anim/anticipate_interpolator 开始的时候从后向前甩 AnticipateOvershootInterpolator android:anim/anticipate_overshoot_interpolator 类似上面AnticipateInterpolator 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 向前弹出一定值之后回到原来位置 PathInterpolator   新增定义路径坐标后按照路径坐标来跑。 如上就是系统提供的一些插值器下面我们来看看怎么使用他们。 2-5-2 插值器使用方法 插值器的使用比较简单如下 set android:interpolatorandroid:anim/accelerate_interpolator... /set2-5-3 插值器的自定义 有时候你会发现系统提供的插值器不够用可能就像View一样需要自定义。所以接下来我们来看看插值器的自定义关于插值器的自定义分为两种实现方式xml自定义实现其实就是对现有的插值器的一些属性修改或者java代码实现方式。如下我们来说说。 先看看XML自定义插值器的步骤 在res/anim/目录下创建filename.xml文件。修改你准备自定义的插值器如下?xml version1.0 encodingutf-8? InterpolatorName xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:attribute_namevalue/ 在你的补间动画文件中引用该文件即可。 可以看见上面第二步修改的是现有插值器的一些属性但是有些插值器却不具备修改属性具体如下 accelerateDecelerateInterpolator 无可自定义的attribute。 accelerateInterpolator android:factor 浮点值加速速率默认值为1。 anticipateInterploator android:tension 浮点值起始点后拉的张力数默认值为2。 anticipateOvershootInterpolator android:tension 浮点值起始点后拉的张力数默认值为2。  android:extraTension 浮点值拉力的倍数默认值为1.5。 bounceInterpolator 无可自定义的attribute。 cycleInterplolator android:cycles 整形循环的个数默认为1。 decelerateInterpolator android:factor 浮点值减速的速率默认为1。 linearInterpolator 无可自定义的attribute。 overshootInterpolator android:tension 浮点值超出终点后的张力默认为2。 再来看看Java自定义插值器的Java自定义插值器其实是xml自定义的升级也就是说如果我们修改xml的属性还不能满足需求那就可以选择通过Java来实现方式。 可以看见上面所有的Interpolator都实现了Interpolator接口而Interpolator接口又继承自TimeInterpolatorTimeInterpolator接口定义了一个float getInterpolation(float input);方法这个方法是由系统调用的其中的参数input代表动画的时间在0和1之间也就是开始和结束之间。 如下就是一个动画始末速率较慢、中间加速的AccelerateDecelerateInterpolator插值器 public class AccelerateDecelerateInterpolator extends BaseInterpolatorimplements NativeInterpolatorFactory {......public float getInterpolation(float input) {return (float)(Math.cos((input 1) * Math.PI) / 2.0f) 0.5f;}...... }到此整个补间动画与补间动画的插值器都分析完毕了接下来看下别的动画。 【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流】 3 Drawable AnimationDrawable动画使用详解 3-1 Drawable动画概述 Drawable动画其实就是Frame动画帧动画它允许你实现像播放幻灯片一样的效果这种动画的实质其实是Drawable所以这种动画的XML定义方式文件一般放在res/drawable/目录下。具体关于帧动画的xml使用方式翻墙点击我查看java方式翻墙点击我查看。 如下图就是帧动画的源码文件 可以看见实际的真实父类就是Drawable。 3-2 Drawable动画详细说明 我们依旧可以使用xml或者java方式实现帧动画。但是依旧推荐使用xml具体如下 animation-list 必须是根节点包含一个或者多个item元素属性有 android:oneshot true代表只执行一次false循环执行。item 类似一帧的动画资源。 item animation-list的子项包含属性如下 android:drawable 一个frame的Drawable资源。android:duration 一个frame显示多长时间。 3-3 Drawable动画实例演示 关于帧动画相对来说比较简单这里给出一个常规使用框架如下 !-- 注意rocket.xml文件位于res/drawable/目录下 -- ?xml version1.0 encodingutf-8? animation-list xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:oneshot[true | false] itemandroid:drawable[package:]drawable/drawable_resource_nameandroid:durationinteger / /animation-listImageView rocketImage (ImageView) findViewById(R.id.rocket_image); rocketImage.setBackgroundResource(R.drawable.rocket_thrust);rocketAnimation (AnimationDrawable) rocketImage.getBackground(); rocketAnimation.start();特别注意AnimationDrawable的start()方法不能在Activity的onCreate方法中调运因为AnimationDrawable还未完全附着到window上所以最好的调运时机是onWindowFocusChanged()方法中。 至此帧动画也就说明完成了。让我们接下来进入Android更牛叉的动画类型。 4 Property Animation属性动画使用详解 在使用属性动画之前先来看几个常用的View属性成员 translationXtranslationY控制View的位置值是相对于View容器左上角坐标的偏移。rotationXrotationY控制相对于轴心旋转。xy控制View在容器中的位置即左上角坐标加上translationX和translationY的值。alpha控制View对象的alpha透明度值。 这几个常用的属性相信大家都很熟悉接下来的属性动画我们就从这里展开。 4-1 属性动画概述 Android 3.0以后引入了属性动画属性动画可以轻而易举的实现许多View动画做不到的事上面也看见了View动画无非也就做那几种事情别的也搞不定而属性动画就可以的譬如3D旋转一张图片。其实说白了你记住一点就行属性动画实现原理就是修改控件的属性值实现的动画。 具体先看下类关系 /*** This is the superclass for classes which provide basic support for animations which can be* started, ended, and have codeAnimatorListeners/code added to them.*/ public abstract class Animator implements Cloneable {...... }所有的属性动画的抽象基类就是他。我们看下他的实现子类    其实可以看见属性动画的实现有7个类PS之所以类继承关系列表会出来那么多是因为我下载了所有版本的SDK你只用关注我红点标注的就行妹的ubuntu下图片处理工具怎么都这么难用进去粗略分析可以发现好几个是hide的类而其他可用的类继承关系又如下 java类名 xml关键字 描述信息 ValueAnimator animator 放置在res/animator/目录下 在一个特定的时间里执行一个动画 TimeAnimator 不支持/点我查看原因 时序监听回调工具 ObjectAnimator objectAnimator 放置在res/animator/目录下 一个对象的一个属性动画 AnimatorSet set 放置在res/animator/目录下 动画集合 所以可以看见我们平时使用属性动画的重点就在于AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator。所以接下来我们就来依次说说如何使用。 4-2 属性动画详细说明 4-2-1 属性动画计算原理 参看Android官方文档英文原版详情点我查看 Android属性动画注意最低兼容版本不过可以使用开源项目来替代低版本问题提供了以下属性 Duration动画的持续时间TimeInterpolation定义动画变化速率的接口所有插值器都必须实现此接口如线性、非线性插值器TypeEvaluator用于定义属性值计算方式的接口有int、float、color类型根据属性的起始、结束值和插值一起计算出当前时间的属性值Animation sets动画集合即可以同时对一个对象应用多个动画这些动画可以同时播放也可以对不同动画设置不同的延迟Frame refreash delay多少时间刷新一次即每隔多少时间计算一次属性值默认为10ms最终刷新时间还受系统进程调度与硬件的影响Repeat Country and behavoir重复次数与方式如播放3次、5次、无限循环可以让此动画一直重复或播放完时向反向播放 接下来先来看官方为了解释原理给出的两幅图其实就是初中物理题不解释 上面就是一个线性匀速动画描述了一个Object的X属性运动动画该对象的X坐标在40ms内从0移动到40每10ms刷新一次移动4次每次移动为40/410pixel。    上面是一个非匀速动画描述了一个Object的X属性运动动画该对象的X坐标在40ms内从0移动到40每10ms刷新一次移动4次但是速率不同开始和结束的速度要比中间部分慢即先加速后减速。 接下来我们来详细的看一下属性动画系统的重要组成部分是如何计算动画值的下图描述了如上面所示动画的实现作用过程。 其中的ValueAnimator是动画的执行类跟踪了当前动画的执行时间和当前时间下的属性值ValueAnimator封装了动画的TimeInterpolator时间插值器和一个TypeEvaluator类型估值用于设置动画属性的值就像上面图2非线性动画里TimeInterpolator使用了AccelerateDecelerateInterpolator、TypeEvaluator使用了IntEvaluator。 为了执行一个动画你需要创建一个ValueAnimator并且指定目标对象属性的开始、结束值和持续时间。在调用start后整个动画过程中 ValueAnimator会根据已经完成的动画时间计算得到一个0到1之间的分数代表该动画的已完成动画百分比。0表示0%1表示100%譬如上面图一线性匀速动画中总时间 t 40 mst 10 ms的时候是 0.25。 当ValueAnimator计算完已完成动画分数后它会调用当前设置的TimeInterpolator去计算得到一个interpolated插值分数在计算过程中已完成动画百分比会被加入到新的插值计算中。如上图2非线性动画中因为动画的运动是缓慢加速的它的插值分数大约是 0.15小于t 10ms时的已完成动画分数0.25。而在上图1中这个插值分数一直和已完成动画分数是相同的。 当插值分数计算完成后ValueAnimator会根据插值分数调用合适的 TypeEvaluator去计算运动中的属性值。 好了现在我们来看下代码就明白这段话了上面图2非线性动画里TimeInterpolator使用了AccelerateDecelerateInterpolator、TypeEvaluator使用了IntEvaluator。所以这些类都是标准的API我们来看下标准API就能类比自己写了如下 首先计算已完成动画时间分数以10ms为例t10ms/40ms0.25。 接着看如下源码如何实现计算差值分数的 public class AccelerateDecelerateInterpolator extends BaseInterpolatorimplements NativeInterpolatorFactory {public AccelerateDecelerateInterpolator() {}......//这是我们关注重点可以发现如下计算公式计算后input即为时间因子插值大约为0.15。public float getInterpolation(float input) {return (float)(Math.cos((input 1) * Math.PI) / 2.0f) 0.5f;}...... }其实AccelerateDecelerateInterpolator的基类接口就是TimeInterpolator如下他只有getInterpolation方法也就是上面我们关注的方法。 public interface TimeInterpolator {float getInterpolation(float input); }接着ValueAnimator会根据插值分数调用合适的TypeEvaluatorIntEvaluator去计算运动中的属性值如下因为startValue 0所以属性值00.15*40-0 6。 public class IntEvaluator implements TypeEvaluatorInteger {public Integer evaluate(float fraction, Integer startValue, Integer endValue) {int startInt startValue;return (int)(startInt fraction * (endValue - startInt));} }这就是官方给的一个关于属性动画实现的过程及基本原理解释相信你看到这里是会有些迷糊的没关系你先有个大致概念就行接下来我们会慢慢进入实战因为Android的属性动画相对于其他动画来说涉及的知识点本来就比较复杂所以我们慢慢来。 4-2-2 XML方式属性动画 在xml中可直接用的属性动画节点有ValueAnimator、ObjectAnimator、AnimatorSet。如下是官方的一个例子和解释详情点我 setandroid:ordering[together | sequentially]objectAnimatorandroid:propertyNamestringandroid:durationintandroid:valueFromfloat | int | colorandroid:valueTofloat | int | colorandroid:startOffsetintandroid:repeatCountintandroid:repeatMode[repeat | reverse]android:valueType[intType | floatType]/animatorandroid:durationintandroid:valueFromfloat | int | colorandroid:valueTofloat | int | colorandroid:startOffsetintandroid:repeatCountintandroid:repeatMode[repeat | reverse]android:valueType[intType | floatType]/set.../set /setset属性解释 xml属性 解释 android:ordering 控制子动画启动方式是先后有序的还是同时进行。sequentially:动画按照先后顺序together(默认):动画同时启动 objectAnimator属性解释 xml属性 解释 android:propertyName String类型必须要设置的节点属性代表要执行动画的属性通过名字引用辟如你可以指定了一个View的”alpha” 或者 “backgroundColor” 这个objectAnimator元素没有对外说明target属性所以你不能在XML中设置执行这个动画必须通过调用loadAnimator()方法加载你的XML动画资源然后调用setTarget()应用到具备这个属性的目标对象上譬如TextView。 android:valueTo float、int或者color类型必须要设置的节点属性表明动画结束的点如果是颜色的话由6位十六进制的数字表示。 android:valueFrom 相对应valueTo动画的起始点如果没有指定系统会通过属性的get方法获取颜色也是6位十六进制的数字表示。 android:duration 动画的时长int类型以毫秒为单位默认为300毫秒。 android:startOffset 动画延迟的时间从调用start方法后开始计算int型毫秒为单位。 android:repeatCount 一个动画的重复次数int型”-1“表示无限循环”1“表示动画在第一次执行完成后重复执行一次也就是两次默认为0不重复执行。 android:repeatMode 重复模式int型当一个动画执行完的时候应该如何处理。该值必须是正数或者是-1“reverse”会使得按照动画向相反的方向执行可实现类似钟摆效果。“repeat”会使得动画每次都从头开始循环。 android:valueType 关键参数如果该value是一个颜色那么就不需要指定因为动画框架会自动的处理颜色值。有intType和floatType默认两种分别说明动画值为int和float型。 objectAnimator属性解释  同上objectAnimator属性不多介绍。 XML属性动画使用方法 AnimatorSet set (AnimatorSet) AnimatorInflater.loadAnimator(myContext,R.animtor.property_animator); set.setTarget(myObject); set.start();4-2-3 Java方式属性动画 1、ObjectAnimator继承自ValueAnimator允许你指定要进行动画的对象以及该对象的一个属性。该类会根据计算得到的新值自动更新属性。大多数的情况使用ObjectAnimator就足够了因为它使得目标对象动画值的处理过程变得足够简单不用像ValueAnimator那样自己写动画更新的逻辑但是ObjectAnimator有一定的限制比如它需要目标对象的属性提供指定的处理方法譬如提供getXXXsetXXX方法这时候你就需要根据自己的需求在ObjectAnimator和ValueAnimator中看哪种实现更方便了。 ObjectAnimator类提供了ofInt、ofFloat、ofObject这个三个常用的方法这些方法都是设置动画作用的元素、属性、开始、结束等任意属性值。当属性值上面方法的参数只设置一个时就把通过getXXX反射获取的值作为起点设置的值作为终点如果设置两个参数那么一个是开始、另一个是结束。特别注意ObjectAnimator的动画原理是不停的调用setXXX方法更新属性值所有使用ObjectAnimator更新属性时的前提是Object必须声明有getXXX和setXXX方法。我们通常使用ObjectAnimator设置View已知的属性来生成动画而一般View已知属性变化时都会主动触发重绘图操作所以动画会自动实现但是也有特殊情况譬如作用Object不是View或者作用的属性没有触发重绘或者我们在重绘时需要做自己的操作那都可以通过如下方法手动设置 ObjectAnimator mObjectAnimator ObjectAnimator.ofInt(view, customerDefineAnyThingName, 0, 1).setDuration(2000); mObjectAnimator.addUpdateListener(new AnimatorUpdateListener(){Overridepublic void onAnimationUpdate(ValueAnimator animation){//int value animation.getAnimatedValue(); 可以获取当前属性值//view.postInvalidate(); 可以主动刷新//view.setXXX(value);//view.setXXX(value);//......可以批量修改属性}});如下是一个我在项目中的Y轴3D旋转动画实现实例 ObjectAnimator.ofFloat(view, rotationY, 0.0f, 360.0f).setDuration(1000).start();2、PropertyValuesHolder多属性动画同时工作管理类。有时候我们需要同时修改多个属性那就可以用到此类具体如下 PropertyValuesHolder a1 PropertyValuesHolder.ofFloat(alpha, 0f, 1f); PropertyValuesHolder a2 PropertyValuesHolder.ofFloat(translationY, 0, viewWidth); ...... ObjectAnimator.ofPropertyValuesHolder(view, a1, a2, ......).setDuration(1000).start();如上代码就可以实现同时修改多个属性的动画啦。 3、ValueAnimator属性动画中的时间驱动管理着动画时间的开始、结束属性值相应时间属性值计算方法等。包含所有计算动画值的核心函数以及每一个动画时间节点上的信息、一个动画是否重复、是否监听更新事件等并且还可以设置自定义的计算类型。 特别注意ValueAnimator只是动画计算管理驱动设置了作用目标但没有设置属性需要通过updateListener里设置属性才会生效。 ValueAnimator animator ValueAnimator.ofFloat(0, mContentHeight); //定义动画 animator.setTarget(view); //设置作用目标 animator.setDuration(5000).start(); animator.addUpdateListener(new AnimatorUpdateListener() {Overridepublic void onAnimationUpdate(ValueAnimator animation){float value (float) animation.getAnimatedValue();view.setXXX(value); //必须通过这里设置属性值才有效view.mXXX value; //不需要setXXX属性方法} }); 大眼看上去可以发现和ObjectAnimator没啥区别实际上正是由于ValueAnimator不直接操作属性值所以要操作对象的属性可以不需要setXXX与getXXX方法你完全可以通过当前动画的计算去修改任何属性。 4、AnimationSet动画集合提供把多个动画组合成一个组合的机制并可设置动画的时序关系如同时播放、顺序播放或延迟播放。具体使用方法比较简单如下 ObjectAnimator a1 ObjectAnimator.ofFloat(view, alpha, 1.0f, 0f); ObjectAnimator a2 ObjectAnimator.ofFloat(view, translationY, 0f, viewWidth); ...... AnimatorSet animSet new AnimatorSet(); animSet.setDuration(5000); animSet.setInterpolator(new LinearInterpolator()); //animSet.playTogether(a1, a2, ...); //两个动画同时执行 animSet.play(a1).after(a2); //先后执行 ......//其他组合方式 animSet.start(); 5、Evaluators相关类解释 Evaluators就是属性动画系统如何去计算一个属性值。它们通过Animator提供的动画的起始和结束值去计算一个动画的属性值。 IntEvaluator整数属性值。 FloatEvaluator浮点数属性值。 ArgbEvaluator十六进制color属性值。 TypeEvaluator用户自定义属性值接口譬如对象属性值类型不是int、float、color类型你必须实现这个接口去定义自己的数据类型。 既然说到这了那就来个例子吧譬如我们需要实现一个自定义属性类型和计算规则的属性动画如下类型float[] ValueAnimator valueAnimator new ValueAnimator(); valueAnimator.setDuration(5000); valueAnimator.setObjectValues(new float[2]); //设置属性值类型 valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.setEvaluator(new TypeEvaluatorfloat[]() {Overridepublic float[] evaluate(float fraction, float[] startValue,float[] endValue){//实现自定义规则计算的float[]类型的属性值float[] temp new float[2];temp[0] fraction * 2;temp[1] (float)Math.random() * 10 * fraction;return temp;} });valueAnimator.start(); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {Overridepublic void onAnimationUpdate(ValueAnimator animation){float[] xyPos (float[]) animation.getAnimatedValue();view.setHeight(xyPos[0]); //通过属性值设置View属性动画view.setWidth(xyPos[1]); //通过属性值设置View属性动画} });6、Interpolators相关类解释 AccelerateDecelerateInterolator先加速后减速。 AccelerateInterpolator加速。 DecelerateInterpolator减速。 AnticipateInterpolator先向相反方向改变一段再加速播放。 AnticipateOvershootInterpolator先向相反方向改变再加速播放会超出目标值然后缓慢移动至目标值类似于弹簧回弹。 BounceInterpolator快到目标值时值会跳跃。 CycleIinterpolator动画循环一定次数值的改变为一正弦函数Math.sin(2 * mCycles * Math.PI * input)。 LinearInterpolator线性均匀改变。 OvershottInterpolator最后超出目标值然后缓慢改变到目标值。 TimeInterpolator一个允许自定义Interpolator的接口以上都实现了该接口。 举个例子就像系统提供的标准API一样如下就是加速插值器的实现代码我们自定义时也可以类似实现 //开始很慢然后不断加速的插值器。 public class AccelerateInterpolator implements Interpolator {private final float mFactor;private final double mDoubleFactor;public AccelerateInterpolator() {mFactor 1.0f;mDoubleFactor 2.0;}......//input 0到1.0。表示动画当前点的值0表示开头1表示结尾。//return 插值。值可以大于1超出目标值也可以小于0突破低值。Overridepublic float getInterpolation(float input) {//实现核心代码块if (mFactor 1.0f) {return input * input;} else {return (float)Math.pow(input, mDoubleFactor);}} }综上可以发现我们可以使用现有系统提供标准的东东实现属性动画也可以通过自定义继承相关接口实现自己的动画只要实现上面提到的那些主要方法即可。 4-2-4 Java属性动画拓展之ViewPropertyAnimator动画 在Android API 12时View中添加了animate方法具体如下 public class View implements Drawable.Callback, KeyEvent.Callback,AccessibilityEventSource {....../*** This method returns a ViewPropertyAnimator object, which can be used to animate* specific properties on this View.** return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.*/public ViewPropertyAnimator animate() {if (mAnimator null) {mAnimator new ViewPropertyAnimator(this);}return mAnimator;}...... }可以看见通过View的animate()方法可以得到一个ViewPropertyAnimator的属性动画有人说他没有继承Animator类是的他是成员关系不是之前那种继承关系。 ViewPropertyAnimator提供了一种非常方便的方法为View的部分属性设置动画切记是部分属性它可以直接使用一个Animator对象设置多个属性的动画在多属性设置动画时它比 上面的ObjectAnimator更加牛逼、高效因为他会管理多个属性的invalidate方法统一调运触发而不像上面分别调用所以还会有一些性能优化。如下就是一个例子 myView.animate().x(0f).y(100f).start(); 4-2-5 Java属性动画拓展之LayoutAnimator容器布局动画 Property动画系统还提供了对ViewGroup中View添加时的动画功能我们可以用LayoutTransition对ViewGroup中的View进行动画设置显示。LayoutTransition的动画效果都是设置给ViewGroup然后当被设置动画的ViewGroup中添加删除View时体现出来。该类用于当前布局容器中有View添加、删除、隐藏、显示等时候定义布局容器自身的动画和View的动画也就是说当在一个LinerLayout中隐藏一个View的时候我们可以自定义 整个由于LinerLayout隐藏View而改变的动画同时还可以自定义被隐藏的View自己消失时候的动画等。 我们可以发现LayoutTransition类中主要有五种容器转换动画类型具体如下 LayoutTransition.APPEARING当View出现或者添加的时候View出现的动画。 LayoutTransition.CHANGE_APPEARING当添加View导致布局容器改变的时候整个布局容器的动画。 LayoutTransition.DISAPPEARING当View消失或者隐藏的时候View消失的动画。 LayoutTransition.CHANGE_DISAPPEARING当删除或者隐藏View导致布局容器改变的时候整个布局容器的动画。 LayoutTransition.CHANGE当不是由于View出现或消失造成对其他View位置造成改变的时候整个布局容器的动画。 XML方式使用系统提供的默认LayoutTransition动画 我们可以通过如下方式使用系统提供的默认ViewGroup的LayoutTransition动画 android:animateLayoutChanges”true”在ViewGroup添加如上xml属性默认是没有任何动画效果的因为前面说了该动画针对于ViewGroup内部东东发生改变时才有效所以当我们设置如上属性然后调运ViewGroup的addView、removeView方法时就能看见系统默认的动画效果了。 还有一种就是通过如下方式设置 android:layoutAnimation”anim/customer_anim”通过这种方式就能实现很多吊炸天的动画。 Java方式使用系统提供的默认LayoutTransition动画 在使用LayoutTransition时你可以自定义这几种事件类型的动画也可以使用默认的动画总之最终都是通过setLayoutTransition(LayoutTransition lt)方法把这些动画以一个LayoutTransition对象设置给一个ViewGroup。 譬如实现如上Xml方式的默认系统LayoutTransition动画如下 mTransitioner new LayoutTransition(); mViewGroup.setLayoutTransition(mTransitioner);稍微再高端一点吧我们来自定义这几类事件的动画分别实现他们那么你可以像下面这么处理 mTransitioner new LayoutTransition(); ...... ObjectAnimator anim ObjectAnimator.ofFloat(this, scaleX, 0, 1); ......//设置更多动画 mTransition.setAnimator(LayoutTransition.APPEARING, anim); ......//设置更多类型的动画 mViewGroup.setLayoutTransition(mTransitioner);到此通过LayoutTransition你就能实现类似小米手机计算器切换普通型和科学型的炫酷动画了。 5 Android动画总结 到此Android动画基本已经描述OK了也就这么三大类尤其是属性动画更加一筹。但是特别说一句上面基本都没有提及到各种动画的Listener接口原因是这个玩意太简单所以不提了相信你会监听View的onClickListener就一定会触类旁通动画的Listener方法的。有了这些基础相信无论是自定义控件时还是自定义动画时都会起到直接的指导参考作用。其实对于Android的动画实现远远不止现在提到的这些但是这些又是基础所以后面还会写文章说说Android提供的其他动画参考工具类的。 现在我们继续沿用官方的对比翻译一下这些动画的区别具体如下点我参看原文How Property Animation Differs from View Animation View动画 View动画只能够为View添加动画如果想为非View对象添加动画须自己实现且View动画支持的种类很少尤其是他改变的是View的绘制效果View的属性没有改变其位置与大小都不变 View动画代码量少使用简单方便。 Property动画 弥补了View动画的缺陷你可以为一个对象的任意属性添加动画对象自己的属性会被真的改变当对象的属性变化的时候属性动画会自动刷新屏幕属性动画改变的是对象的真实属性而且属性动画不止用于View还可以用于任何对象。 待补充Android5.X SVG矢量动画机制
http://www.sadfv.cn/news/34549/

相关文章:

  • 网站建设工作领导小组网站代码规范性
  • 美的集团网站建设建设网站外包
  • 福田莲花网站建设郑州专业做淘宝网站
  • 网站建设银行北京冬奥会纪念币发行时间企业官网建设
  • wordpress怎么建立空白文档河南seo优化
  • 鲜花网网站开发的意义网站开发技术服务协议
  • Joomla外贸网站模板wordpress好用么
  • 万润 企业网站建设大岭山网站仿做
  • 免费建站系统有哪些莱芜二手房出售信息最新房源
  • 产品营销型网站建设携程的网站建设项目规划书
  • 南平做网站中山网站建设文化
  • 阿里云 做网站东莞网站建设优化方案
  • 怎么样将网站内容做的漂亮即墨网站建设招聘
  • 关于建设公司网站的建议不会写代码怎么做网站
  • vps建两个网站要两个程序池吗网站美化工具
  • linux 网站备份群晖wordpress 映射
  • 深圳龙霸网站建设物三室内设计培训班哪家好
  • 网站seo服务商h5平台官网
  • 做的网站百度不收录seo系统oem
  • 怎样建设网站啊软文的概念
  • 网站项目需求大疆网站建设
  • 购物网站建设要多少钱重庆企业网站推广方案
  • 镇江网站建设优化排名如何注册网站怎么注册
  • 电子商务网站建设估算湖州十大进出口公司
  • app拉新平台搜索引擎的优化和推广
  • 设计公司网站欣赏wordpress 电商 插件
  • 网站开发分层重庆网站网络推广
  • 傻瓜自助建站软件12380网站开发
  • 做网站计入什么科目名创 网站建设
  • 海口网站建设就q479185700上墙深圳平台网站开发