![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=1739291461-VpXTfZ2W0ozs0hZOePeG56Ogp20B9aI5-0-cee5f8c9568a0534c3a12bc23574368b)
和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=1739291461-cy45bOf5KubCT2JtP5KpAez6HYvbINj7-0-79756dab3dd903e2337ea25cbd4616dd)
此时,完整的onDraw函数代码如下:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_35.jpg?sign=1739291461-QjsHRoew0xNEVIQzaoaOrMygVIIgKtxN-0-8cd40fba84e94d24b5704e7c84e238af)
完整的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=1739291461-EhnsC6GmjFvgYsqCnt1jGyv0oNqyxbm6-0-1f19b07fcf0cbadc0a11787271150dfd)
图1-10
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_37.jpg?sign=1739291461-hivBqobOnbtl8sKRPS4qbeG43WWKD3q9-0-7205b0d153443554a7754beb48a890ab)
扫码查看动态效果图
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_38.jpg?sign=1739291461-kTG0hdRmUOuFhzkv8qMbp2Fzt29HunMD-0-3234136f9a810c6e49ced4f813e47704)
图1-11
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_39.jpg?sign=1739291461-MpicHRSEoFXsvGDhfZKyYKFa52oAxNMH-0-d3a4f446a49233671789f6bd0c5ce6d3)
扫码查看彩色图
从图1-11可以看到,在物体向右移动之后,屏幕上形成的二维图像(如黑框所示)也向右移动了。这刚好与效果图中的效果相对应。
2.沿Y轴平移
同样地,如果沿着Y轴移动,可以将示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_40.jpg?sign=1739291461-9gXxLYtqa6FeEJCgNNmEo0X6LjmdmGOG-0-54d3400a99922c17c32a3a56f60e8e7c)
对应的效果如图1-12所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_41.jpg?sign=1739291461-vYGQQBPAGcLa29edm0fFjisKNhnJgiQc-0-75c74beab8cc8ad8f36ac276d8709e89)
图1-12
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_42.jpg?sign=1739291461-z9ZLQKfhskDlKL2a7mYPE6TB18RsB7IQ-0-066da1ddedbab7cc87c4546c248b9d9f)
扫码查看动态效果图
原理如图1-13所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_43.jpg?sign=1739291461-2jSs1T2ydZvBQIrBmgeSV3gUIMzQ6RxG-0-2e07f273c511b86ad6c2ac04f1efed2f)
图1-13
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_44.jpg?sign=1739291461-gI2uXnQBVTlM1iTkdy6Qw2nZb6TAITKb-0-694b1478e5c2b3a89d54c8c763d2ff38)
扫码查看彩色图
可以看到,在物体向上移动后,屏幕上对应的二维图像也向上移动了(黄框移动到黑框位置),这就解释了为什么会出现效果图中的效果。
3.沿Z轴平移
(1)沿Z轴正方向平移
沿Z轴平移的效果比较特殊,它能实现图像的放大与缩小,我们先来看看效果。如果把示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_45.jpg?sign=1739291461-T7EEEOHmrlpDtuDL3qGyaoslYr5txGEN-0-f7640459ecf94d02063538747ef2c433)
即沿Z轴的正方向从1 px移动到360 px,效果如图1-14所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_46.jpg?sign=1739291461-Eqn9dywiPBrCCjDsooc1fM7m27YIBVZc-0-d5e52ea3f1e8e42faf3c5cfab50fd5e5)
图1-14
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_47.jpg?sign=1739291461-BxRFdQkaOAYUoJETOK7rnvaRgSVS78NL-0-317589a39e36c4affc960a798abe0202)
扫码查看动态效果图
在图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=1739291461-EaPnPUf0heLKFxZBv8d6NNLnwuTYD8N6-0-e635ee9e034647a11a785c048de125cc)
图1-15
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_49.jpg?sign=1739291461-Wv9fDRab5TxHdYDreUlcZB03Jk4FYEgX-0-aa6d488a6aca706fdb15cd06b233c014)
扫码查看彩色图
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_50.jpg?sign=1739291461-3iELCftrOsparvEfP4e9G9cSEL2GuYrZ-0-eac9957db0373dec7921b6052b886fa8)
图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=1739291461-UH2LJvyWRm2eQivMlJ7xhZgMOLJv3Bp8-0-25ba9dbfd9cc193d8aa7ad1eefa478de)
图1-17
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_52.jpg?sign=1739291461-KoeL5EXgJJp5G1jEqnJ9fo5qphlUZnkh-0-9968a64f5cf343ba4893f7e97f17d755)
扫码查看彩色图
(2)沿Z轴负方向平移
相反地,如果我们让物体沿Z轴负方向移动,即将示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_53.jpg?sign=1739291461-HXUfjWdcFjirhlLiqTDcVW2ize1y2BWI-0-7c3c54dde90c2d4976b80acc388732ff)
需要注意,为了更好地演示效果,这里不仅取了负号而且乘以了2,Z轴负方向的最大移动距离变为-720,效果如图1-18所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_54.jpg?sign=1739291461-ID8ijMwEHrt2sXgcW62YbhlBCuvlYv1s-0-58f0c36125141ac39e7ff0c7592f6510)
图1-18
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_55.jpg?sign=1739291461-ZqzUBJEwE8lo3ECwd08V3hQkameF1nU4-0-2c813a440a1782ed6db3fe250866c79c)
扫码查看动态图
从图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=1739291461-rV0AipDwvYxhp1NYLjrT2cVDnks4Xglc-0-23fef7421daee504094385cdae127836)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_57.jpg?sign=1739291461-SDiWEBYNTvphUYpNYq9phxM2R9N0U4xP-0-7aedfca3105289912c27d459a6ac14e2)
旋转的函数总共有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=1739291461-GGuOFuAvJDwLMtFBtFtzzAt6ncccKrU7-0-6d3ec4b3984e3ea335d5f80a3649d04e)
效果如图1-19所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_59.jpg?sign=1739291461-uIbF9IYVK6hhTBiSN2Lhs6wNug4gfbNO-0-b452288aaa6f335f35f6d45b8a9bb07f)
图1-19
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_60.jpg?sign=1739291461-181O9MfYyHYbCP9dXtsGQlZvpv5VBk2l-0-8d6987110075dca4f5fc5ac8ec58419f)
扫码查看动态图
因为3D坐标系的原点位于View的左上角,所以,当图像绕X轴旋转时,是直接绕X轴旋转的。但是,在旋转到90°时,就看不到图像了。
首先,绕X轴的正方向旋转,如图1-20所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_61.jpg?sign=1739291461-KkM7fA9ExIIJ5Mv6ehKPkIl1pvpTu1E5-0-40609f07c293a0001b8149a2716415cc)
图1-20
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_62.jpg?sign=1739291461-SO4WH962HZoXuShRlMxRR3ayuAWYmPkt-0-1b6eaf8464f7b5b68c90aa61433695d1)
扫码查看彩色图
图1-20展示了X、Y、Z轴各自的旋转正方向,在后面的demo效果图中,我们也可以具体查看。
旋转过程中的示意图如图1-21所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_63.jpg?sign=1739291461-yXPaKTEYxcg1OETYrWQLAO77YBXULDN7-0-69c98cf64cc7a494e0fe0c29ab86ca7d)
图1-21
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_64.jpg?sign=1739291461-fO0dgnB0fbEZ3GAkVDJFrR9UuMhjih7m-0-9d63fe4002e9af1794452ca9ad045ff1)
扫码查看彩色图
图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=1739291461-RAyJI4vaJUPKHaKGEgO6nrSs3Povdit8-0-dde1d8cc79ceaef79135de4bfa8476f9)
效果如图1-22所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_66.jpg?sign=1739291461-Slitaian0DO5mBUiZbTxVvjPoAI2v117-0-fdc1bff9591bfab3dfbb16e5e15fa432)
图1-22
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_67.jpg?sign=1739291461-TSWlSaU4ENNZoxYJqn2SSH3b2bowau3l-0-4de0041d577335401d8e4fb29897ea41)
扫码查看动态效果图
从图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=1739291461-kRnzLLld7eXOelnhC5Cux01IVhCP3Bk8-0-f47d3fa996dd420d9a3fda4a1203040c)
效果如图1-23所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_69.jpg?sign=1739291461-xKoo4w0tRKK6HiP3SlZrpumiSGKqYKj1-0-3177bd5980e0721a459017a0219e4f9b)
图1-23
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_70.jpg?sign=1739291461-6WCRrpJNgherv7Iy5D3wpnHusb3nOjvP-0-aea88092adf27f0bb00fa681edfe7fc6)
扫码查看动态效果图
同样地,以坐标系原点为中心绕Z轴旋转。在图像旋转90°以后(大于90°且小于270°),图像就与View没有交集了,所以屏幕上没有任何图像,即屏幕上不显示任何内容。
4.调整旋转中心点
从上面的效果可以看出,默认都是围绕X、Y、Z轴旋转的,有时我们想实现翻转卡片的效果,扫码查看右侧效果图。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_71.jpg?sign=1739291461-oyiKyDChpZxWry4yQcpLhcmIUzSIDqLs-0-9257e9f1a5624e5174e61e2ed6a4d662)
扫码查看动态效果图
在这个示例中,很明显,旋转中心点变为了图像中心点。那么怎么调整旋转中心点呢?
如果我们想将默认的3D坐标系中心点调整到(x,y)位置,只需要在获取矩阵后,通过下面的代码将中心点位置调整到(x,y)位置:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_72.jpg?sign=1739291461-bNeTDoAKVT6yCKPOBgCgZd5BmXAdGFSu-0-a2737997380ce35a115634d8bc03a379)
有关这段代码,我们会放在第2章讲解位置矩阵时详细说明,在这里,大家只要会用就行。但需要特别注意的一点是,这里是通过后期改变矩阵的值来改变旋转中心点的,并没有改变原始Camera的位置,Camera在View所在的2D坐标系中的投影位置依然在View的左上角(0,0)处。
比如,我们修改一下demo中的代码,将旋转中心点改为图像中心点:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_73.jpg?sign=1739291461-WP9SmMGSXqL7f5WjeH1gSvpytNtZnPeY-0-9a971aa2b83b5621aaa2cd267d71e161)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_74.jpg?sign=1739291461-Pl5nAEeYyKSBTc0fUJUdqGhK8sXmtlz7-0-d3a1a79dfad227eac6184e59c2069f10)
这段代码比较好理解,只是在操作了Camera以后,通过camera.getMatrix(matrix)获取对应操作的matrix数组,然后通过调整旋转中心点的代码,将旋转中心点调整到图像中心点。
调整中心点后绕X轴旋转的效果如图1-24所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_75.jpg?sign=1739291461-CzORxlM18i9MeDdDKQVIz11euBVwL3b2-0-7e3dd9a954ced53cf73071cb72beeb6a)
图1-24
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_76.jpg?sign=1739291461-DTGImew8PeQRocEWYmrhnQtJVqboXFss-0-126947afaf2d24bce9f00521ca055ef5)
扫码查看动态效果图
同样地,调整旋转中心点到图像中心点后,绕Y轴旋转的效果如图1-25所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_77.jpg?sign=1739291461-RkM9bnsL7WqT4PzFCPqBBecncKPLBxsq-0-266ac328c4fe664af47e5547f3313297)
图1-25
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_78.jpg?sign=1739291461-B2DiFnFilui2WwPQviaY0JCrp4GFFkDU-0-9905715cb16928b2444518fa255cdafc)
扫码查看动态效果图
最后,再来看看在调整旋转中心点到图像中心点后,绕Z轴旋转的效果如图1-26所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_79.jpg?sign=1739291461-d6xHwosQnqWMBw7OqDTMIwH6ix8itBkN-0-82e7c1433c2e3209ff22a5f6f81aec00)
图1-26
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_80.jpg?sign=1739291461-6QBT4P8IgXIVbD8vA85lS3OQfLXgaK1L-0-dbfd21419c2d3d0ec4ae905d02931ac3)
扫码查看动态效果图
1.2.3 改变Camera的位置
在API≥15时,Camera类新增了几个函数来获取和改变Camera的位置:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_81.jpg?sign=1739291461-hqnxxvnd7G5Xgml6i71oIWaHUq2uTcZ0-0-d5a9530ca44d4ad8ed3d8bb1f32e5446)
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=1739291461-4YW37ggsbRsjTbenLY8C6gAUTMpvXji7-0-785a58a56156aaf7b281be51a1ff1cea)
日志如图1-27所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_83.jpg?sign=1739291461-IESiqmchkny1nW0D9FcSGLzjMiVVoQR5-0-1a44113faaa5e6b9cd853f4c520c3526)
图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=1739291461-KZj6uAiYI45lpORhL7Hc2xVbr9ZWz8vb-0-69452402c960a5445f0de12bc167fc4d)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_85.jpg?sign=1739291461-kBzyb2nKXY6F0v3FETkHy4fYzcSXY17v-0-af670a5165dc0ed0972b78956b821ecd)
从上面的代码可以看出,我们通过getWidth()/2得到了中心点位置的坐标,然后除以72换算成英寸单位。需要注意的是,Y轴的正方向是沿着屏幕向上的,所以,我们若要让Camera向下移动,需要将移动距离设置为-centerY。
效果如图1-28所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_86.jpg?sign=1739291461-Kb4g4yocubWMcpQ1HmEiYTKVSMGo2a0o-0-feadbaff768dca11c313a4471a106ce4)
图1-28
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_87.jpg?sign=1739291461-r6NMBtmarpCgmZyLDxwKMjtD10o4YM8B-0-4984b5982709eb2b05dc71723afab0cf)
扫码查看动态效果图
这里有两点需要注意:
(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=1739291461-xFY8qiqU0HCrTmTMhKFZ88PjjClCYa4x-0-75071c36f19edc04e9b337254f5391da)
图1-29
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_89.jpg?sign=1739291461-WIJKhWaK0Zhb2l3ur9dVpvk4zVphzKOH-0-d35c42e5e8d3b487a9ca906e8516eb53)
扫码查看彩色图
在图1-29中,红色框表示当Camera在图像左上角外部时显示的图像范围,此时,整个图像都可以得到显示;绿色框表示在Camera移到图像中心点外部以后,显示范围随着Camera移动的情况。从这个示意图可以看出,在Camera移到图像中心点外部以后,只能显示右下角部分的图像,与代码运行效果相同。
Camera的移动与图像显示理解起来相对有些难度,大家可以把A4纸当作View,把手机摄像头当作Camera,通过移动手机摄像头来查看手机屏幕中显示内容的变化情况,两者的原理完全相同。