控件的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的效果使得整体的翻转跟自然。
时间: 2024-10-19 20:59:04