Android属性动画实战(一)
2016-04-13 16:40
513 查看
属性动画,就是通过改变对象的属性产生动画
先看看效果
![](https://img-blog.csdn.net/20160413163954778)
对象的属性有以下几种:
操作对象属性的相关的类有:
1. ObjectAnimator 动画的执行类,后面详细介绍
2. ValueAnimator 动画的执行类,后面详细介绍
3. AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
4. AnimatorInflater 用户加载属性动画的xml文件
5. TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
6. TimeInterpolator 时间插值,上面已经介绍。
一)ObjectAnimator ,这个比较简单,但是有几点必须条件:
1,有对象
2,对象有get…() set…( )方法
二)ValueAnimator 它只需要设定好初始值和结束值,然后在监听中对对象进行操作就ok了
先看看效果
对象的属性有以下几种:
1. Duration动画的持续时间,默认300ms。 2. Time interpolation:时间差值,乍一看不知道是什么,但是我说LinearInterpolator、AccelerateDecelerateInterpolator,大家一定知道是干嘛的 了,定义动画的变化率。 3. Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。 4. Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。 5. Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。
操作对象属性的相关的类有:
1. ObjectAnimator 动画的执行类,后面详细介绍
2. ValueAnimator 动画的执行类,后面详细介绍
3. AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
4. AnimatorInflater 用户加载属性动画的xml文件
5. TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
6. TimeInterpolator 时间插值,上面已经介绍。
一)ObjectAnimator ,这个比较简单,但是有几点必须条件:
1,有对象
2,对象有get…() set…( )方法
/** * setRotationX() 这是View中的方法 * Sets the degrees that the view is rotated around the horizontal axis through the pivot point * 意思是让View沿着水平防线旋转 * <p/> * 动画更新中,会不断的调用setRotationX()这个方法,所以必须得有setRotationX() 和getRotationX()方法 */ private void tranXz() { ObjectAnimator animal = ObjectAnimator .ofFloat(ivIcon, "rotationX", 0.0f, 360.f) .setDuration(300); animal.start(); }
/** * 随便设置一个方法jh,虽然看不出来有任何动画,但是确实有动画值了500毫秒 * addUpdateListener这个是监听动画执行的过程 * <p/> * animatedValue 这个值是从1到0不断的不规律缩减的 * 04-12 23:02:38.773 14675-14675/com.animationexample I/System.out: value====1.0 * 04-12 23:02:38.790 14675-14675/com.animationexample I/System.out: value====0.9971504 * 04-12 23:02:38.808 14675-14675/com.animationexample I/System.out: value====0.9892905 * ............. * 04-12 23:02:39.198 14675-14675/com.animationexample I/System.out: value====0.06646466 * 04-12 23:02:39.224 14675-14675/com.animationexample I/System.out: value====0.02447176 * 04-12 23:02:39.252 14675-14675/com.animationexample I/System.out: value====0.010709524 * 04-12 23:02:39.282 14675-14675/com.animationexample I/System.out: value====0.0 */ private void tansDrop() { ObjectAnimator dropAnimal = ObjectAnimator .ofFloat(ivIcon, "jh", 1.0f, 0.0f) .setDuration(500); dropAnimal.start(); dropAnimal.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); // System.out.println("value====" + value); // 淡出并且缩小 ivIcon.setAlpha(value); ivIcon.setScaleX(value); ivIcon.setScaleY(value); } }); }
二)ValueAnimator 它只需要设定好初始值和结束值,然后在监听中对对象进行操作就ok了
/** * 第一种方法:直接操作属性设置View的translationY属性 * 第二种方法:是自己通过监听来改变View的属性,更加灵活 */ private void tansBelow() { /* ObjectAnimator dropAnimal = ObjectAnimator .ofFloat(ivIcon2, "translationY", 0, StringUtil.getScreenHeight() - ivIcon2.getHeight()) .setDuration(500); dropAnimal.start();*/ // ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, StringUtil.getScreenHeight() - ivIcon2.getHeight()) .setDuration(500); valueAnimator.start(); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { ivIcon2.setTranslationY((Float) animation.getAnimatedValue()); } }); }
private void tranShe() { //先设置好起点和终点 PointF startPoint = new PointF(ivIcon3.getX(), ivIcon3.getY()); PointF endPoint = new PointF(ivIcon3.getX()-300,ivIcon3.getY()-300); ValueAnimator sheAnimator = ValueAnimator.ofObject(new MyPointEvaluator(), startPoint, endPoint); sheAnimator.setDuration(500); sheAnimator.start(); sheAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { PointF pontf = (PointF) animation.getAnimatedValue(); System.out.println(pontf.x); ivIcon3.setX(pontf.x); ivIcon3.setY(pontf.y); } }); } //Evaluator动态设置属性值 public class MyPointEvaluator implements TypeEvaluator<PointF> { @Override // 实现TypeEvaluator接口的evaluate()方式,fraction是动画的进度,从0.0到1.0,根据进度,初始值和最终值,给出动画过程的中间值。 public PointF evaluate(float fraction, PointF startValue, PointF endValue) { PointF point = new PointF(); point.x = startValue.x + fraction * (endValue.x - startValue.x); point.y = startValue.y + fraction * (endValue.y - startValue.y); return point; } }
相关文章推荐
- Android设置TextView颜色setTextColor
- Android之GPS定位详解
- Android中dip(dp)与px之间单位转换
- android零碎知识点总结
- Android studio import module Cannot find declaration to go to
- Adb --help
- AndroidManifest versionCode
- android 中PendingIntent 和AlarmManager
- android设计模式之observer
- Android TextView部分文字指定颜色
- Android 带一键删除按钮的EditText
- android 自定义闪退Dialog 收集闪退信息
- android完美解决ClickableSpan中点击后ListView中item的长按冲突的问题
- Android中的MVP设计模式
- Android中显示html标签解决方案
- Android Studio compile project添加一个本地项目依赖包时,提示程序包不存在
- 带滑动菜单的Recyclerview实现
- android中回调机制
- 《Android源码设计模式》读书笔记 (22) 第22章 享元模式
- picasso-强大的Android图片下载缓存库