![Android自定义控件高级进阶与精彩实例](https://wfqqreader-1252317822.image.myqcloud.com/cover/747/36511747/b_36511747.jpg)
1.2 Camera类用法详解
在了解了如何使用Camera类以后,再来看看Camera类具有的操作Camera的函数。本节会对这些函数进行简单的讲解,而后面还会使用具体的示例进行讲解。
1.2.1 平移
平移函数如下:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_33.jpg?sign=1739235039-hpH0CPJsXLyIsFYJU7GsVtBrWEorwIDJ-0-5db23d07de56c3cbca8ff4b616cd1620)
和2D平移函数类似,只不过本节介绍的这个函数中多出了一个维度,从只能在2D平面上平移变为在3D空间内平移。
参数介绍如下。
●float x:X轴上的偏移量。
●float y:Y轴上的偏移量。
●float z:Z轴上的偏移量。
1.沿X轴平移
如果我们将1.1节示例中的旋转代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_34.jpg?sign=1739235039-7vswoSDu83K7pHrIWrw1782ZWgYxb7Kn-0-1b943699a8fab6cb69bfc702a105ad22)
此时,完整的onDraw函数代码如下:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_35.jpg?sign=1739235039-KOoHw0T9vkavufD7EKf8q5A4trbnei46-0-34f9dfa4c18f67be425390b9255671ba)
完整的onDraw函数代码仅在本节中列出,后续的相关代码中都将只改变camera.translate(mProgress,0,0);这行代码。
效果如图1-10所示。
可能有的读者会想,camera.translate(5,0,0)是什么意思呢?是Camera正向移动5 px,还是物体正向移动5 px呢?
其实Camera类的各个函数操作的并不是摄像机,而是物体,我们看到的是移动物体之后屏幕上图像的变化。
比如,camera.translate(5,0,0)表示的移动与拍摄过程如图1-11所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_36.jpg?sign=1739235039-kzL3P1n7reMiwwUlXkuD1KEXcXJeRbTQ-0-06056617321c3c89484c40c0d47a92f2)
图1-10
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_37.jpg?sign=1739235039-J8BzMjetxeSs8Z1FtyIL6dDCKjKeKoAb-0-b1858cbd3233c4e227f3ccc164772e32)
扫码查看动态效果图
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_38.jpg?sign=1739235039-SWEiH7dvaeG0Nx0kpIKxJwV6sUjsul6c-0-2d7097fbea02b0a88dd0c230b0ce59d8)
图1-11
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_39.jpg?sign=1739235039-bRLmwGDKfTJf7eceVukhsghD2RkWRbu8-0-c0f8987b7e258e0807a624ded8cbf8f5)
扫码查看彩色图
从图1-11可以看到,在物体向右移动之后,屏幕上形成的二维图像(如黑框所示)也向右移动了。这刚好与效果图中的效果相对应。
2.沿Y轴平移
同样地,如果沿着Y轴移动,可以将示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_40.jpg?sign=1739235039-cPI3WGEcNrqyMsUjGeVuQJNVSATmqWzB-0-53e0c48e366cf9edd77876345cbf7357)
对应的效果如图1-12所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_41.jpg?sign=1739235039-j6IroOw2RQsSSiYEAfRBtsC3EX0XAvi0-0-696406cc1ecdaea2b738c0ce778d29ff)
图1-12
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_42.jpg?sign=1739235039-Fnz7gLtC0ywdJI8vCydSkRTEFEHPFWl7-0-ac974dd208907522b94889c88830e4bd)
扫码查看动态效果图
原理如图1-13所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_43.jpg?sign=1739235039-Fw3Zbmy5yWEKIwpCNIlfn8CksdX67eEG-0-2d6727d1372bf297bdc41c0aed5ffbaf)
图1-13
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_44.jpg?sign=1739235039-fr7T0zfI1YxSgzeEbk43GuQVSMVWPMn5-0-00457ad7bcc0cc05bd546baf14ff0c31)
扫码查看彩色图
可以看到,在物体向上移动后,屏幕上对应的二维图像也向上移动了(黄框移动到黑框位置),这就解释了为什么会出现效果图中的效果。
3.沿Z轴平移
(1)沿Z轴正方向平移
沿Z轴平移的效果比较特殊,它能实现图像的放大与缩小,我们先来看看效果。如果把示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_45.jpg?sign=1739235039-hqKGFqeeBlgtMlbYFQ7u5GMl6qWSsqLm-0-e5193bc5d2dabf3e41c1b2511237d3f0)
即沿Z轴的正方向从1 px移动到360 px,效果如图1-14所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_46.jpg?sign=1739235039-ldgSsrduSIdfCBWYzgrHOA9vj9FtNZyk-0-4be38e6acf21a6b1127f7dc289c5f35f)
图1-14
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_47.jpg?sign=1739235039-kBl0o9axHONplosp0vUVM3DykatihxeP-0-faec68fc10c06eef2c625ca4b152c043)
扫码查看动态效果图
在图1-14中,首先,随着物体沿Z轴正方向移动距离的增大,图像逐渐变小。其次,虽然图像在变小,但图像左上角在屏幕上的位置始终不变。下面就分别讲解这两个现象的原因。
随着物体沿Z轴正方向移动距离的增大,图像逐渐变小,原理图如图1-15所示。
从图1-15可以看出,源图像在屏幕上对应的是黑框位置,在图像向Z轴正方向移动后,其在屏幕上对应的是黄框位置。随着图像沿Z轴离屏幕越来越远,图像和Camera的连线与屏幕的交点所形成的图像越来越小。这一点不难理解,就像图1-16中的铁轨。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_48.jpg?sign=1739235039-Bt8hGyyCmFQANzpi4tdxweEy3HMtQqIx-0-e8ce637ea51cfabad55af0e99736bf39)
图1-15
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_49.jpg?sign=1739235039-KBJ5BrTGkkjh6MrPZ3dhTXKoiXRsPz2D-0-ef4398d6bb523096f45d1346c39945f1)
扫码查看彩色图
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_50.jpg?sign=1739235039-r7ifJ8lEjZBNPT1IwgZMS160tTq1OUQV-0-bc385378689241c469b9541a909cf14b)
图1-16
我们都知道两条铁轨之间的距离是完全相同的,但随着铁轨的远离,两条铁轨之间的距离看起来越来越小。
关于第二个现象,为什么屏幕上图像的左上角位置始终不变呢?
前面曾经提到过Camera的位置在3D坐标系的(0,0,-576)处,其投影到View上位于View的左上角处,所以当图像远离Camera时,都是以左上角为原点来缩小的,如图1-17所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_51.jpg?sign=1739235039-b3IGRsbP9q8TfCFQuqvT3G8yBpn93qgC-0-02addcc78fcb4af9f76aef2f9ca316f1)
图1-17
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_52.jpg?sign=1739235039-ge7HcMuPT2Ar7RNRB7ctsiJ9WqFkjLLb-0-787697be4597f2e5be18734e4f25d396)
扫码查看彩色图
(2)沿Z轴负方向平移
相反地,如果我们让物体沿Z轴负方向移动,即将示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_53.jpg?sign=1739235039-2ORrFR8SMgqAJm2OyxrdHJzDnSmxTEX5-0-b8e661394328d966ccc537196715b76a)
需要注意,为了更好地演示效果,这里不仅取了负号而且乘以了2,Z轴负方向的最大移动距离变为-720,效果如图1-18所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_54.jpg?sign=1739235039-3rcDDUAFZ3m8srh5EoSFO2aCewflcwqh-0-bcea81c27a981c80772dea49f93852ce)
图1-18
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_55.jpg?sign=1739235039-4HbLoq122brr0mdVSOEAVv8OaDQRAHwI-0-4d5ecab35c26cb255d2a3e78875fc88f)
扫码查看动态图
从图1-18可以看出,随着物体向Z轴负方向移动,图像逐渐变大,但在达到一定的大小后,图像却突然不见了。
在这里读者可能会产生两个疑问:
●为什么图像会变大呢?
●为什么图像会消失呢?
首先,对于第一个问题,随着物体向Z轴负方向移动,图像逐渐变大,这是因为Camera在Z轴上位于-576 px处,所以当物体向Z轴负方向移动时,其实是距离Camera越来越近了,当然图像会越来越大。而且,当图像大到一定程度时,我们就只能看到其中一部分。同样地,由于Camera投影到View上时位于View的左上角,所以图像在变大的过程中仍然是以左上角为原点变大的。
但当物体移动到Camera位置时,就看不到物体了,这时的表现是屏幕上没有对应的图像。这一点其实也很好理解,你可以拿着一个水杯,将其由远及近地靠近你的一只眼睛,当水杯跟你的眼睛平齐时,即水杯在耳朵位置时,你就看不到水杯了。
到这里,有关3D效果中的平移就介绍完了。相对而言,3D效果中的平移理解起来困难一些,我们可以用生活中的例子来演示这个效果。比如,你把眼睛当作Camera,用一个物体来模拟View,在眼前来回移动这个物体,这样就可以辅助理解camera.translate相关参数的意义与效果。
1.2.2 旋转
旋转是3D动画的核心效果,但因为单个View是没有厚度的,所以通过它制作出来的旋转效果并不算是真正的3D效果,而是伪3D效果。但我们可以像开始介绍的StereoView控件一样,通过多个View的组合旋转来实现看起来更真实的3D效果。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_56.jpg?sign=1739235039-pIuiO2TgBkM7uaedL2f1bNstCmleHy2b-0-8603cefe67c73faf93e37619efa98610)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_57.jpg?sign=1739235039-VVOXHUDLxHCeQ72RzPWXjaiCr1wT02QC-0-299df2439bd84c5976e53e91b79b79de)
旋转的函数总共有4个,其中rotate(float x,float y,float z)可以同时指定3个维度的旋转角度,但它是API 12后才加入的新函数,而其他3个函数都只能一次绕一个维度旋转,它们在API 1时就已经存在。当然,如果你需要在API 12之前同时绕多个维度旋转,可以多次调用旋转函数。
1.绕X轴旋转
将示例中的Camera操作代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_58.jpg?sign=1739235039-nzdI7dCFXjExtHMlGH5Kyx5nXBxqNRAG-0-8172ad12962897a2cf8f8beb64058652)
效果如图1-19所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_59.jpg?sign=1739235039-DuKkoCNju7Nt4jcSTsvfFF8m3M20LzQB-0-9cfeb9c5ee20e92295e5b824a8882858)
图1-19
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_60.jpg?sign=1739235039-ueIiwV8kgSBVzBF6BlkxnuyWjMPaR2L7-0-82458f46c5e5f87fd67e5b04e1f10315)
扫码查看动态图
因为3D坐标系的原点位于View的左上角,所以,当图像绕X轴旋转时,是直接绕X轴旋转的。但是,在旋转到90°时,就看不到图像了。
首先,绕X轴的正方向旋转,如图1-20所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_61.jpg?sign=1739235039-gOEyNmwtHdn4YloTkR0wERzBBBPgTWQn-0-57fd1370e539e8c2f2d75ac71d8d859a)
图1-20
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_62.jpg?sign=1739235039-T24Gkmk08EitEeyjmOCQdCLrn0jtUwgi-0-0f17d308cee93a52a17f6168c9be4848)
扫码查看彩色图
图1-20展示了X、Y、Z轴各自的旋转正方向,在后面的demo效果图中,我们也可以具体查看。
旋转过程中的示意图如图1-21所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_63.jpg?sign=1739235039-TorXsGGBSxR6nk1wcFSSoT7lCULxaKiN-0-2b28538a78d7df31ce22c1e7e3a5f87b)
图1-21
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_64.jpg?sign=1739235039-YdKGrHceHqFD4UHjD4k7OOwbuPDRfT13-0-02c18137844b0a28b996608275452207)
扫码查看彩色图
图1-21显示了旋转前和旋转后屏幕上图像的示意图。原始图像是黑框,旋转后的图像是黄框。大家也可以拿一张纸在摄像机前旋转并模拟这个过程,以更好地理解旋转功能。
因为Camera的位置在(0,0,-576)处,也就是说Camera在3D坐标系Z轴上的-576 px处,当图像旋转到90°时,Camera与图像在一个平面上,这时屏幕上的效果就是在图像旋转90°以后(大于90°且小于270°)什么也看不到了。
2.绕Y轴旋转
将demo的代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_65.jpg?sign=1739235039-dXjK4bXxo1UwlFV1DPBsr85ZBeCaEAAm-0-2ce5a2a648b64fb04e4a134fd3830149)
效果如图1-22所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_66.jpg?sign=1739235039-okqkcpkIb7BO4NSQ9w4ERCAF7fQKhzkI-0-fdf0164a6177bd9fa4833b2e13fd7fd6)
图1-22
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_67.jpg?sign=1739235039-sUpQuXKLKoq36e1ofHlJxhkseq8myILm-0-40fa10ccc6fcaac8eb331bc589d41e39)
扫码查看动态效果图
从图1-22可以看出,图像默认是绕Y轴旋转的,在旋转90°以后(大于90°且小于270°),Camera与图像在一个平面上,图像与屏幕的View区域没有交集,所以不显示任何内容。
3.绕Z轴旋转
将demo的代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_68.jpg?sign=1739235039-LCQ3iQYzZjOHi13F0et4XHWe3wTge4CZ-0-d9b0998c557fc8a859dfc337e31a021d)
效果如图1-23所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_69.jpg?sign=1739235039-Kr0t9HeWAs8rYp8iM67eU9RTmu680pHb-0-0fa94e424e597be782f410902795da6a)
图1-23
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_70.jpg?sign=1739235039-aQtZdVnLPqYiKXhKZJE8quLjsWPqojeq-0-91307d89f9161af217381866b62b5e8b)
扫码查看动态效果图
同样地,以坐标系原点为中心绕Z轴旋转。在图像旋转90°以后(大于90°且小于270°),图像就与View没有交集了,所以屏幕上没有任何图像,即屏幕上不显示任何内容。
4.调整旋转中心点
从上面的效果可以看出,默认都是围绕X、Y、Z轴旋转的,有时我们想实现翻转卡片的效果,扫码查看右侧效果图。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_71.jpg?sign=1739235039-M85rpi25EQP6m7YhsBUTNIsVMeSH5DX8-0-b8a2ece2b3bcf76ad6946dbd766f9126)
扫码查看动态效果图
在这个示例中,很明显,旋转中心点变为了图像中心点。那么怎么调整旋转中心点呢?
如果我们想将默认的3D坐标系中心点调整到(x,y)位置,只需要在获取矩阵后,通过下面的代码将中心点位置调整到(x,y)位置:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_72.jpg?sign=1739235039-3ozwmWOioHaagltwOegjx6f5pprSazf2-0-e4f7796f15ec39e9df017a13f3e2b7ed)
有关这段代码,我们会放在第2章讲解位置矩阵时详细说明,在这里,大家只要会用就行。但需要特别注意的一点是,这里是通过后期改变矩阵的值来改变旋转中心点的,并没有改变原始Camera的位置,Camera在View所在的2D坐标系中的投影位置依然在View的左上角(0,0)处。
比如,我们修改一下demo中的代码,将旋转中心点改为图像中心点:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_73.jpg?sign=1739235039-QLrIDCfQfumAGJfPND755Yq9g6PuqWIJ-0-e9856aa98337d543db1fd37ed6346cb7)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_74.jpg?sign=1739235039-3gvxSkpH9ItnqrsANEcZdKuIwmH9utR6-0-ccafe0ae834bfcc1146830bb2c9398da)
这段代码比较好理解,只是在操作了Camera以后,通过camera.getMatrix(matrix)获取对应操作的matrix数组,然后通过调整旋转中心点的代码,将旋转中心点调整到图像中心点。
调整中心点后绕X轴旋转的效果如图1-24所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_75.jpg?sign=1739235039-KXrcSAlXF64xzJYGfYfG4nVpZyPsYOfo-0-e213ca751346fa79680aaf86c4fb2fa5)
图1-24
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_76.jpg?sign=1739235039-ZDCQMbchI2ilmDP183ZjuTW25lzAukBp-0-2bfb9035a0ab737eac17b22c16f1290e)
扫码查看动态效果图
同样地,调整旋转中心点到图像中心点后,绕Y轴旋转的效果如图1-25所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_77.jpg?sign=1739235039-tKCtyRkIiGjakm0BhPj2KkBqnwD2lUCX-0-45c37b65ca0c7a9cc4b43d3a252621c0)
图1-25
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_78.jpg?sign=1739235039-CIa9AMnsl982QzUOwiWEcUiBoR3jWpeH-0-8159a2152ad0450810998e26a247bb61)
扫码查看动态效果图
最后,再来看看在调整旋转中心点到图像中心点后,绕Z轴旋转的效果如图1-26所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_79.jpg?sign=1739235039-PMIJ2Iy3aFJX225ibEPbbT97fxPUpB4P-0-e558578d13e89c9f53799a5893d50beb)
图1-26
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_80.jpg?sign=1739235039-SqPPhIA06h5T08kpggBwzDcTUvBCxTFo-0-186b04eeab985b537e992fd3e1efb8fb)
扫码查看动态效果图
1.2.3 改变Camera的位置
在API≥15时,Camera类新增了几个函数来获取和改变Camera的位置:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_81.jpg?sign=1739235039-UGu1sGwu1og1shmDojyFie6jIb7qM1Ci-0-92a3dca6afc71c302b19cf32684bf154)
1.Camera的坐标单位
这里有一个非常奇怪的问题,那就是Camera的坐标单位不是px,而是其每个单位表示72 px。
这个单位的表示函数可以在Android底层的图像引擎Skia中找到。在Skia中,Camera的位置单位是英寸,1英寸可换算为72 px,而在Android中把这个换算函数照搬了过来。这个换算函数是固定的,不会随着手机分辨率的改变而变化。
比如,我们在onDraw中通过日志获取Camera默认的位置信息,代码如下:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_82.jpg?sign=1739235039-6VgB9PxieTbtFj93uDHrVBQpxRCVxxlP-0-497934c93875ec29df640dfd4dcf3916)
日志如图1-27所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_83.jpg?sign=1739235039-2hBXDwuxtSiAtlfny037Oq8nhog5qbxN-0-78d4a1c1b01f4a46cfbb7714cbafd696)
图1-27
可以看到,在默认的情况下,Camera的位置在View左上角外部,并且位于Z轴的-576 px位置(-8×72=-576)。
2.更改Camera的位置
我们可以通过void setLocation(float x,float y,float z)来设置Camera的位置。但需要注意的是,设置位置时,一个单位相当于72 px,所以这里的参数值需要做单位变换。
假如我们将Camera的位置从默认的左上角外部移到图像中心点外部,代码如下:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_84.jpg?sign=1739235039-loTSKA17MYJeVf5dwoMyefVjWdsT7MhO-0-65ef6b5d4872bae36ed8ef1bc16bf94a)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_85.jpg?sign=1739235039-nkKLxXcKNvsr4oDHczUGpSVSNwJEiU8r-0-b6ed55e42294e452dec221a02ec23fcf)
从上面的代码可以看出,我们通过getWidth()/2得到了中心点位置的坐标,然后除以72换算成英寸单位。需要注意的是,Y轴的正方向是沿着屏幕向上的,所以,我们若要让Camera向下移动,需要将移动距离设置为-centerY。
效果如图1-28所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_86.jpg?sign=1739235039-fZiBTeFm11QCsWFoqwItFBT3RPb8goVw-0-b7ceb18459af52fd602778c33848906e)
图1-28
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_87.jpg?sign=1739235039-qA2NX9kajfAH2NO8sLpamLXECSWkP8Vu-0-af33b7d81371ec006eb5b359dd1c618b)
扫码查看动态效果图
这里有两点需要注意:
(1)当将Camera移到图像中心点外部以后,图像只显示右下角的四分之一,这是为什么呢?
(2)当将Camera移到图像中心点外部以后,图像的旋转中心仍在图像的左上角。Camera的位置可以通过setLocation函数来改变,而如果我们想要改变3D坐标系的位置,则需要通过Matrix操作来实现。
下面的示意图展示了Camera从图像的左上角外部移到图像中心点外部的过程,如图1-29所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_88.jpg?sign=1739235039-UCxiWfkJ5XhA8tZ0w6EDoWlyl9lQAo51-0-f61f072edec7e69836b07f548d1cfe8a)
图1-29
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_89.jpg?sign=1739235039-0NJ6vnlqsX7D05QTRmhUWnQQLzr5nYBh-0-fe78bede57210d3067e8ccc3945d28fe)
扫码查看彩色图
在图1-29中,红色框表示当Camera在图像左上角外部时显示的图像范围,此时,整个图像都可以得到显示;绿色框表示在Camera移到图像中心点外部以后,显示范围随着Camera移动的情况。从这个示意图可以看出,在Camera移到图像中心点外部以后,只能显示右下角部分的图像,与代码运行效果相同。
Camera的移动与图像显示理解起来相对有些难度,大家可以把A4纸当作View,把手机摄像头当作Camera,通过移动手机摄像头来查看手机屏幕中显示内容的变化情况,两者的原理完全相同。