码迷,mamicode.com
首页 > 其他好文 > 详细

属性动画实现翻滚的控件

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

标签:android   动画   控件   

控件的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的效果使得整体的翻转跟自然。






属性动画实现翻滚的控件

标签:android   动画   控件   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!