Android 属性动画(Property Animation)
来源:互联网 发布:iphone照片批量导入mac 编辑:程序博客网 时间:2024/06/17 05:51
概述
Property Animation是一个强大的动画框架,它支持对任何对象进行动画操作。你可以定义一个动画让对象的属性随着时间的变化而改变,不管动画是否需要在屏幕上绘制出来。属性动画会在一个特定的时间内改变某个对象的属性值。想要进行动画操作,你需要指定对象动画的属性,如对象在屏幕上的位置,动画的执行时间等。
Android Developer:http://developer.android.com/intl/zh-cn/guide/topics/graphics/prop-animation.html
相关属性值
- Duration:动画持续时间,setDuration()
- Time interpolation:插值器,setInterpolator()
- Repeat count and behavior:动画重复次数和重复方式,setRepeatCount()和setRepeatMode()
- Animator sets:动画集
- Frame refresh delay:帧刷新频率
相关API
Animator
创建属性动画的基类,该类通常不会被使用,一般通过继承该类实现属性动画。
- ValueAnimator:属性动画的主要时间引擎,主要计算属性动画的属性值。属性动画主要由两个功能组成:(1)计算各帧的属性值;(2)为指定对象设置计算的值。ValueAnimator主要负责功能1,如果想通过ValueAnimator实现功能2,需要为ValueAnimator添加AnimatorUpdateListener监听。
- ObjectAnimator:可以通过为指定对象的属性执行动画。
- AnimatorSet:属性集,执行组合动画。
Evaluators
用于控制属性动画如何计算属性值。
- IntEvaluator:int类型默认Evaluator
- FloatEvaluator:float类型默认Evaluator
- ArgbEvaluator:16进制RGB颜色类型默认Evaluator
- TypeEvaluator:Evaluator接口类,可以用于自定义Evaluator
Interpolators
差值器,在 Android 逐帧动画&补间动画 已经介绍。
ValueAnimator
使用ValueAnimator执行动画有以下步骤:
- 通过ValueAnimator的ofInt,ofFloat,ofObject的静态方法获得ValueAnimator对象
- 设置动画时间,重复方式,重复次数,插值器
- 添加AnimatorUpdateListener监听器
- 开始动画
如下代码:
/*** ValueAnimator演示*/public void showValueAnimator() { ValueAnimator animator = ValueAnimator.ofInt(1, 100); //设置动画时间,重复方式,重复次数,插值器 animator.setDuration(3000); animator.setRepeatMode(ValueAnimator.RESTART); animator.setRepeatCount(3); animator.setInterpolator(new AccelerateInterpolator()); //添加监听 animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //改变TextView显示的值 mTvShow.setText(animation.getAnimatedValue() + ""); } }); animator.start();}
ObjectAnimator
ObjectAnimator继承自ValueAnimator,它可以将ValueAnimator 计算出来的值直接设置到指定对象的属性上。因此使用ObjectAnimator不需要像ValueAnimator通过注册AnimatorUpdateListener实现动画效果。
如下代码:
/*** ObjectAnimator演示*/public void showObjectAnimator() { //定义一个动画平移TextView ObjectAnimator animAlpha = ObjectAnimator.ofFloat(mTvShow, "translationX", 0f, 100f); animAlpha.setDuration(3000); animAlpha.setRepeatMode(ValueAnimator.REVERSE); animAlpha.setRepeatCount(3); animAlpha.start();}
在这里需要说明,通过ObjectAnimator的ofInt,ofFloat,ofObject的静态方法获得对象时,需要指定具体的对象及对象属性名。如上述代码的TextView对象mTvShow及它的平移属性translationX。
使用ObjectAnimator注意事项:
1. 指定对象的属性必须添加setter方法,如translationX的setTranslationX,alpha的setAlpha。
2. 通过ofInt,ofFloat,ofObject创建对象时,一般情况下需要指定开始和结束的属性值,如果只指定一个,默认为结束属性值。那么此时需要给属性值添加getter方法,通过调用getter方法将获取到的值作为开始属性值
3. 如果需要显示view的动画效果,需要通过onAnimationUpdate方法调用invalidate()实现。
AnimatorSet
通过AnimatorSet实现组合动画,如下代码:
/*** AnimatorSet演示*/public void showAnimatorSet() { ObjectAnimator animTrans = ObjectAnimator.ofFloat(mTvShow, "translationX", 0f, 300f); ObjectAnimator animRotation = ObjectAnimator.ofFloat(mTvShow, "rotation", 0f, 360f); ObjectAnimator animY = ObjectAnimator.ofFloat(mTvShow, "scaleY", 0.0f, 1.0f); ObjectAnimator animAlpha = ObjectAnimator.ofFloat(mTvShow, "alpha", 0.0f, 1.0f); AnimatorSet animatorSet = new AnimatorSet(); //同时行动画// animatorSet.playTogether(animTrans, animRotation, animAlpha); //顺序执行// animatorSet.playSequentially(animTrans, animRotation, animAlpha); //自定义顺序 animatorSet.play(animAlpha).after(animTrans); animatorSet.play(animAlpha).before(animRotation); animatorSet.play(animRotation).with(animY); animatorSet.setDuration(3000); animatorSet.start(); }
KeyFrame和PropertyValuesHolder介绍
KeyFrame
指定动画关键帧,一个KeyFrame对象定义一个time/value键值对(即指定时间点的属性动画的属性值)。
实现步骤:
1. 通过KeyFrame的静态方法ofInt(), ofFloat(), ofObject()获得keyFrame对象
2. 通过PropertyValuesHolder类的ofKeyframe()方法指定属性的关键帧
3. 通过ObjectAnimator的ofPropertyValuesHolder()方法获得ObjectAnimator对象
代码如下:
/*** 演示KeyFrame*/public void showKeyFrame() { Keyframe kf0 = Keyframe.ofFloat(0f, 0f); Keyframe kf1 = Keyframe.ofFloat(0.5f, 300f); Keyframe kf2 = Keyframe.ofFloat(1f, 100f); PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2); ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(mTvShow, pvhRotation); rotationAnim.setDuration(5000); rotationAnim.start();}
PropertyValuesHolder
PropertyValuesHolder主要用于实现一组动画,使用方法同AnimatorSet类似。
代码如下:
/** * 演示PropertyValuesHolder */public void showPropertyValuesHolder() { PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("translationX", 0f, 300f); PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("rotation", 0f, 360f); ObjectAnimator.ofPropertyValuesHolder(mTvShow, pvhX, pvhY).setDuration(2000).start();}
ViewPropertyAnimator
ViewPropertyAnimator用于对view执行动画操作,使用起来更加方便,只需要调用view的animate()方法即可实现。
代码如下:
/** * ViewPropertyAnimator演示 */public void showViewPropertyAnimator() { mTvShow.animate().setDuration(2000).alpha(1.0f).alpha(0.0f); //mTvShow.animate().setDuration(2000).rotation(300f);}
xml文件定义属性动画
属性动画同帧动画,补间动画一样可以通过xml文件实现。首先创建文件夹res/animator
xml标记说明:
- ValueAnimator:<animator>
- ObjectAnimator:<objectAnimator>
- AnimatorSet:<set>
如下:
//ValueAnimator<animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:repeatCount="1" android:repeatMode="reverse"> <propertyValuesHolder> <keyframe android:fraction="0" android:value="1"/> <keyframe android:fraction=".2" android:value=".4"/> <keyframe android:fraction="1" android:value="0"/> </propertyValuesHolder></animator>
//objectAnimator <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:propertyName="scaleX" android:valueFrom="1.0" android:valueTo="2.0" android:valueType="floatType" ></objectAnimator>
//AnimatorSet<set android:ordering="sequentially"> <set> <objectAnimator android:propertyName="x" android:duration="500" android:valueTo="400" android:valueType="intType"/> <objectAnimator android:propertyName="y" android:duration="500" android:valueTo="300" android:valueType="intType"/> </set> <objectAnimator android:propertyName="alpha" android:duration="500" android:valueTo="1f"/></set>
在代码中调用:
/** * xml演示 */public void showXml() { ObjectAnimator set = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.property_animator); set.setTarget(mTvShow); set.start();}
源码下载:http://download.csdn.net/detail/kaifa1321/9464492
- Android Property Animation 属性动画
- Android Property Animation 属性动画
- Android属性动画---Property Animation
- Android-Property Animation(属性动画)
- Android 属性动画(Property Animation)
- Android 属性动画(Property Animation)
- Android Property Animation属性动画
- Android属性动画(Property Animation)
- Android属性动画(Property Animation)
- Android动画三:属性动画 (property animation)
- Android动画--属性动画Property Animation
- Android属性动画Property Animation,组合动画
- Android属性动画---Property Animation(一)
- Android属性动画---Property Animation(二)
- Android属性动画---Property Animation(三)
- Android属性动画---Property Animation(四)
- Android属性动画---Property Animation(五)
- Android属性动画---Property Animation(六)
- 深入浅出 - Android系统移植与平台开发(九)- JNI介绍
- C++中 引用和指针的区别
- 简单的工厂设计模式
- xcode7 为什么没有dylib文件
- [随笔]gcc的__attribute__编译属性
- Android 属性动画(Property Animation)
- TextSwitcher实现分析
- UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
- Flume架构与源码分析-整体架构
- db2 的正则表达式
- 加班码代码太烧脑,这些美食补个够!
- 查找和替换之sed流编辑器详解
- 当学习前端过程中心态发生了变化
- 解决多个tomcat端口冲突