有关oppo蝴蝶解锁的三D技术
oppo手机的界面设计也是很漂亮的。在很多界面中使用了3D技术塑造出了大量华丽的效果。在蝴蝶解锁中使用了两个对称的三D变幻,宛如蝴蝶翅膀上美丽的花纹。在受到用户点击后,随风缓慢上下扇动,充满浪漫的动感色彩。这里只在技术角度做一些探索。
这个效果由两个子view合成,每个各占整个屏幕的一半。左边子view以右边界为旋转中心,手指向右滑动距离转为绕Y轴施转的角度,角度为正。右边子view以左边界为旋转中心,手指向左滑动距离转为绕Y轴旋转的角度,角度为负,这样恰好与x轴方向一致。这种效果经过转为,可以转为像两扇门一样开关,也是很有意思的。为了保证两个view的对称性,我这里使用一张图片,沿中线分割为两个view的背景。
可以使用函数Bitmap.createBitmap实现.
左view的背景,LeftView.java:
下面代码是两个view的动画效果,手指放开时出现缓慢的上下的有衰减的扇动效果,宛如蝴蝶颤抖的翅膀。本来自己写了一个弹簧振子的模型,通过滑动距离转化为弹簧的能量波动,进而转化为扇动的初速度,加上弹簧的阻尼运动的衰减系数,使其做带负加速度的圆周运动。但运行效果不太满意,大概需要使用JNI来实现才能满足吧,后来采取了系统自带的动画实现。
需要添加如下函数。这里调用了系统的隐藏函数Surface.screenshot,必须使用系统签名。加入系统app中才能使用。当然,也许你也可以使用反射实现。
publicBitmap getScreenBuffer()
{
DisplaymDisplay;
DisplayMetricsmDisplayMetrics;
MatrixmDisplayMatrix = new Matrix();
WindowManagermWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
mDisplay= mWindowManager.getDefaultDisplay();
mDisplayMetrics= new DisplayMetrics();
mDisplay.getRealMetrics(mDisplayMetrics);
mDisplay.getRealMetrics(mDisplayMetrics);
float[]dims = { mDisplayMetrics.widthPixels,
mDisplayMetrics.heightPixels};
mlock= Surface.screenshot((int) dims[0], (int) dims[1]);
returnmlock;
}