首页 > 其他 > 详细

属性动画实现翻滚的控件

时间:2015-01-12 09:30:21      阅读:723      评论:0      收藏:0      [点我收藏+]

控件的3d翻滚动画,即让控件沿着自己的一边进行3d的翻转,例如一个button控件沿着自己的一边翻转180度,此时显示的是自己的背面。

普通动画的效果都是在平面上,因此想到了使用属性动画中 控制rotation属性,实现3d旋转,但是发现属性动画的旋转都是以自己中心为轴的自转,而我们要得效果是以外部参照的“公转”,因此想到了在控件自转的时候添加一个同步的位移效果,这样整体效果看起来像是控件在绕侧边旋转一样。有关属性动画的一些基本知识可以查找论坛上一些大神的博客,讲的很详细,3d翻转的主要逻辑如下(以向下翻转360度为例):

<pre name="code" class="java"><pre name="code" class="java">	public void flipDown(final View v, float start, float end) {
		final int height = v.getMeasuredHeight();
		ObjectAnimator anim = ObjectAnimator
				.ofFloat(v, "rotationX", start, end);// 主动画为一个旋转动画,控制rotationX属性
		anim.addUpdateListener(new AnimatorUpdateListener() {// 为该动画添加一个动画更新监听器

			@Override
			public void onAnimationUpdate(ValueAnimator a) {
				float f = Float.parseFloat(a.getAnimatedValue().toString());// 动画变量的值获取是一个0~360的角度值
				Log.i("info", "value:" + (int) f);
				int n = (int) (f / 180);
				double cons = Math.cos(Math.toRadians(f - n * 180));
				float transY = (float) ((1 + -cons) * height) / 2 + n * height;// 主要的算法步骤
				v.setTranslationY(transY);
			}
		});
		anim.setInterpolator(new OvershootInterpolator());// 可以添加一个interpolator,这个可以看做是决定数值变化快慢的一个函数
		anim.setDuration(1000).start();
	}

其他方向的翻转可以类推之,不过这种实现有一点瑕疵,控件的3d旋转是以自身为轴,所以控件旋转的时候在z轴的正负方向各有一半,所以在翻转的时候会有一点的不协调,所以我加了一个overshoot的效果使得整体的翻转跟自然。






属性动画实现翻滚的控件

原文:http://blog.csdn.net/u012293381/article/details/42612139

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!