Android属性动画个人小结
来源:互联网 发布:大数据的前沿技术培训 编辑:程序博客网 时间:2024/05/17 12:05
ValueAnimator
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setDuration(300); anim.start();
以上几句的意思就是做一个从0f到1f的平滑过渡,类似数字计时。因为没有和任何View联系在一起,所以不会有任何实际显示动画效果。
ObjectAnimator
ObjectAnimator继承自ValueAnimator
private void executeAnimation() { float curTranslationX = mImageView.getTranslationX(); ObjectAnimator animator = ObjectAnimator.ofFloat(mImageView, "translationY", curTranslationX, 500f); animator.setDuration(1000); animator.start();}
上面的代码意思是把这个ImageView 从它的当前位置Y轴向下移动。后面的参数可以多跟几个,如:
ObjectAnimator animator = ObjectAnimator.ofFloat(mImageView, "translationY", curTranslationX, 500f, 0f, 100f);
那么这里就是先向下移动500f,再移动回初始位置,再向下移动100f。
以上代码也可以使用ValueAnimator来完成:
float curTranslationX = mImageView.getTranslationX(); ValueAnimator anim = ValueAnimator.ofFloat(curTranslationX, 500f); anim.setDuration(1000); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mImageView.setTranslationY((float)animation.getAnimatedValue()); } }); anim.start();
可见,根据animation的value值来更新View的属性,达到动画效果。这里我们调用的是setTranslationY,也可以同时调用setTranslationX、setAlpha、setTop、setRoation等等。同时设置几个值,就会同时执行不同种类的动画。
利用AnimatorSet组合动画
这个就不说了,网上随便搜一下就有,示例代码:
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f); ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f); ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f); AnimatorSet animSet = new AnimatorSet(); animSet.play(rotate).with(fadeInOut).after(moveIn); animSet.setDuration(5000); animSet.start();
使用TypeEvaluator
通过定义TypeEvaluator可以自己定义动画的执行方式
private void executeAnimation() { float curTranslationY = mImageView.getTranslationY(); ValueAnimator anim = ValueAnimator.ofObject(new MyTypeEvaluator(), curTranslationY, 100.0f); anim.setDuration(1000); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mImageView.setTranslationY((float) animation.getAnimatedValue()); } }); anim.start(); } class MyTypeEvaluator implements TypeEvaluator<Float> { @Override public Float evaluate(float fraction, Float startValue, Float endValue) { float startFloat = startValue.floatValue(); return startFloat + 0.5f * (fraction * fraction) *(9.8f) * (endValue.floatValue() - startFloat); } }
以上,模拟一个自由落体动画。自定义类里面的fraction表示动画执行的进度,配合这个进度,用公式表达出一个自由落体(公式是瞎JB写的)。这个返回值就是动画执行过程中不停更新的value值。我们通过设置监听,实时通过setTranslationY更新view的位置。
注意,evaluate方法的返回值是一个Object,这里我利用泛型规定为float,这个返回可以是任意对象。比如某些例子里面返回的是一个point对象,其中可以携带x和y两个位置信息。那么我们在ValueAnimator.ofObject里面传入的参数也应该是两个point,代表动画执行过程中,这个point从point1渐渐变成了point2。如:
Point point1 = new Point(0, 0); Point point2 = new Point(300, 300); ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2); anim.setDuration(5000); anim.start();
使用ViewPropertyAnimator
直接对某个View调用animate()。返回一个ViewPropertyAnimator对象。然后在对这个对象进行操作,示例:
imageView.animate().scaleX(30.0f).scaleY(30.0f).setDuration(300).start();
这句的意思是对该view进行放大操作。一连串的调用,每次返回的还是ViewPropertyAnimator对象。这个不知道是不是在使用装饰模式?可以研究一下源码判断。
总结:
我在使用属性动画的过程中,觉得还是不能方便的、随心所欲的控制。有时候不得不创建好几个动画,在A执行完后(使用监听器监听结束),再去开启另一段动画。代码上非常冗长,可读性较差。后面需要继续探究其灵活简便的用法。
- Android属性动画个人小结
- android属性动画小结
- Android 属性动画总小结
- Android动画--属性动画
- android动画 -- 属性动画
- Android动画-属性动画
- Android动画【属性动画】
- Android动画--属性动画
- Android 开发 - 个人小结
- Android 动画学习小结
- Android动画实现小结
- Android-动画小结
- Android动画小结
- 学习Android动画小结
- Android动画小结
- Android动画小结
- Android动画小结
- Android动画小结
- python中的字典
- svn 日常
- dwg转dxf有什么好的操作方法
- centos访问Windows共享文件两种方式:
- Qualcomm Simlock——解锁流程
- Android属性动画个人小结
- Android 中 C++ Thread线程用法
- Struts2框架
- 关于Retrofit返回错误信息的统一解决办法
- 从搭建环境到一个简单Android App测试实例
- [codevs1183]泥泞的道路(二分+正环)
- 安卓配置正式包和测试包不同的名字、图标、同时安装,(极光配置测试和正式)
- ETL学习笔记之实现
- 使用OkhttpUtils作为网络框架同时,使用Glide加载Https图片