首页 > 代码库 > 属性动画实现翻滚的控件

属性动画实现翻滚的控件

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




属性动画实现翻滚的控件