前言
前段时间读到一篇文章,作者通过自定义View实现了一个高仿小米时钟,其中的3D效果很是吸引我,于是抽时间学习了一下,现在总结出来,和大家分享。
正文
想要在Android上实现3D效果,其实并没有想象中那么复杂,我们需要运用两样东西:Camera和Matrix,这里的Camera可不是我们平常拍照用的Camera,这里的Camera是位于android.graphics包下的Camera:
android.graphics.Camera我们可以看到它的作用是:计算3D变换,并且生成一个Matrix,可以应用到Canvas上,这句话其实就是实现3D效果的核心原理。
Camera的坐标系是左手坐标系。当手机平整的放在桌面上,X轴是手机的水平方向,Y轴是手机的竖直方向,Z轴是垂直于手机向里的那个方向。
Camera坐标系
Camera位于坐标点(0,0),也就是视图的左上角。
我们再来了解一下Matrix,Android中的Matrix是一个3 x 3的矩阵,其内容如下:
Matrix
从字面上来看, MSCALE用于处理缩放变换,MTRANS用于处理平移变换,MSKEW用于处理错切变换。最后一行的MPERSP用于处理透视变换,关于透视变换,官方文档中并没有具体的说明,这里也就不再赘述。另外,矩阵是支持旋转变换的,旋转变换是通过同时设置MSCALE和MSKEW来实现的(这里边就是一些数学原理了,笔者也是半壶水,就不在这丢人了,感兴趣的同学可以自己研究一下)。另外有同学可能对错切变换也不是特别理解,笔者当时也是自己查了下才明白,这里简单说明一下,就免得大家再去百度了:
错切变换(skew)在数学上又称为Shear mapping(可译为“剪切变换”)或者Transvection(缩并),它是一种比较特殊的线性变换。错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。错切变换,属于等面积变换,即一个形状在错切变换的前后,其面积是相等的。
X轴错切变换
上图中,各点的y坐标保持不变,但其x坐标则按比例发生了平移。