- Android自定义控件高级进阶与精彩实例
- 启舰
- 3780字
- 2021-03-04 18:45:18
1.2 Camera类用法详解
在了解了如何使用Camera类以后,再来看看Camera类具有的操作Camera的函数。本节会对这些函数进行简单的讲解,而后面还会使用具体的示例进行讲解。
1.2.1 平移
平移函数如下:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_33.jpg?sign=1739197313-3Mkyu8SwoW57KVRBWrF4jWHoOOaxQlcj-0-74c10a404cbb1c525646963797210761)
和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=1739197313-lkxqPRKJqF6Z5hOi2pVa2JNI06Lpn6r8-0-e8b90f0ed53ebf91056033f104c1f503)
此时,完整的onDraw函数代码如下:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_35.jpg?sign=1739197313-TfikYAUiUIC1PbSAWjEQEfVC5mqnZdC3-0-079a4b83b6e505b64d9aecdca9d32e43)
完整的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=1739197313-96m2L3LIyEP4TxY4Vkhxx5h54V8e4FQ2-0-4276d9f22b5191ba4f978387e17006f7)
图1-10
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_37.jpg?sign=1739197313-WGpTInw6Gs6qLK6277lGCqnA657cShjd-0-34e25684b40a25a804eb62a9c4626b2e)
扫码查看动态效果图
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_38.jpg?sign=1739197313-t7hDKrKYAINIOXoO8Vww1GhakZqbgvzc-0-dcfb54e0ad16710511c533b57fa0b16c)
图1-11
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_39.jpg?sign=1739197313-RQnOnP6XzA4YY8kfqetW7RzAPIDyWN2I-0-a9e58cce77bbd19adfa52a720294d9ee)
扫码查看彩色图
从图1-11可以看到,在物体向右移动之后,屏幕上形成的二维图像(如黑框所示)也向右移动了。这刚好与效果图中的效果相对应。
2.沿Y轴平移
同样地,如果沿着Y轴移动,可以将示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_40.jpg?sign=1739197313-MKojhDyQUGUnVkXvJaZ2OcXdtyfKC4TQ-0-7548f125bbec1d4f06fb42a7217627ce)
对应的效果如图1-12所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_41.jpg?sign=1739197313-cIaqbOJMK1vQ1ZRylL8xOJKjyTutEq0C-0-51fad63308bcb98df067efecc22ad5a0)
图1-12
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_42.jpg?sign=1739197313-SXyiQBIWZKlB5kGtEtW0I56XLsji1mc7-0-058e699d2227f7f8564d250d91e515ce)
扫码查看动态效果图
原理如图1-13所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_43.jpg?sign=1739197313-IcNDJ10n4T6Rtx2FIjhZqDY2jyeYj17U-0-97828b5d8dacbea56a656754a7fe2652)
图1-13
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_44.jpg?sign=1739197313-VL6ymuOpBQ60tpUd2BauAVKUng6SqsMN-0-a3d38d727d73a336f94a5ba0fd7e2996)
扫码查看彩色图
可以看到,在物体向上移动后,屏幕上对应的二维图像也向上移动了(黄框移动到黑框位置),这就解释了为什么会出现效果图中的效果。
3.沿Z轴平移
(1)沿Z轴正方向平移
沿Z轴平移的效果比较特殊,它能实现图像的放大与缩小,我们先来看看效果。如果把示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_45.jpg?sign=1739197313-TJdTq0fVCRUZ21DNLgjpQgU4p5YaY4Zz-0-6f4c5ae31317a8eaa29f76029c7880c1)
即沿Z轴的正方向从1 px移动到360 px,效果如图1-14所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_46.jpg?sign=1739197313-INubO3t36yj47cazTSDJCQ53T8EN9yH8-0-98cdb488b85b91cfa157d1d48af2cda4)
图1-14
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_47.jpg?sign=1739197313-nHjAd0TQZaztBj05h2G9R0jmIG3Ucz8g-0-4e23be7b480178ddb4a82a1f26dda382)
扫码查看动态效果图
在图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=1739197313-MG54MqTzDv4FzdqVGDZSBkWfu4C0mrDr-0-d7985cb8e117e1b4f5c5a7b348842075)
图1-15
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_49.jpg?sign=1739197313-UEJ8qVuo7NhGxOER2IjdLiEnZMjgWuui-0-dc03679abf0d67a68349406b491e60a4)
扫码查看彩色图
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_50.jpg?sign=1739197313-JkLCTnI8XXLaOPrzxjyVEpNE15ux6zi0-0-654a49688124595233a4717ef50c7506)
图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=1739197313-cHYXxqdfN1wFI01u7kFUunbShOEOVx0J-0-16b74daed4d7aa257c855b96c1c1abdf)
图1-17
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_52.jpg?sign=1739197313-TAfkuOw0slE56xFMuSpvRxQCY35GpPb5-0-719c2162c5b986078006d2e2ed562914)
扫码查看彩色图
(2)沿Z轴负方向平移
相反地,如果我们让物体沿Z轴负方向移动,即将示例中的移动代码改为:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_53.jpg?sign=1739197313-aooODuM6czhyhO7fmp2VQQxsTnPIgFrI-0-9ffa6d9a848dfbccf5625dd352fc84ce)
需要注意,为了更好地演示效果,这里不仅取了负号而且乘以了2,Z轴负方向的最大移动距离变为-720,效果如图1-18所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_54.jpg?sign=1739197313-XI4N4k4tzefBUUa5hCRk0Be6RogncqxH-0-ee83b9ec98655f9aa33c24d64b74b1c8)
图1-18
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_55.jpg?sign=1739197313-wHM2BCS6jXeP0O59qXlc4xrLx1hGy3Of-0-213b8797d036a2b39e4065cbce065ab4)
扫码查看动态图
从图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=1739197313-l9zWFu9oOBbJ06CG7Cb0Nwe8fX9AffPe-0-c05950e12cf14ccfeabd797394489bbc)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_57.jpg?sign=1739197313-YdJWezroZsLcBHz1MvMbniaPWXIKZ3rq-0-f045e8d1fbb0d7565c9f554952ae9b1c)
旋转的函数总共有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=1739197313-dyDUfkqZ7dx2X3fREfiik2TMATeaAA92-0-db35ec8d62c46d3effbc722180ec23ce)
效果如图1-19所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_59.jpg?sign=1739197313-UacOZbYyvEYiNzF9cL1hEnunBZajCbEZ-0-dafad9429a21c9577b909e10a2901ea4)
图1-19
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_60.jpg?sign=1739197313-G5kchsJLxoZzBIkpyEZhBVlSipnVqApD-0-a77ff633f54116753bd017c154f56d11)
扫码查看动态图
因为3D坐标系的原点位于View的左上角,所以,当图像绕X轴旋转时,是直接绕X轴旋转的。但是,在旋转到90°时,就看不到图像了。
首先,绕X轴的正方向旋转,如图1-20所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_61.jpg?sign=1739197313-58bQTri2nk2yrC2EOvayfPSmwNRg2TsU-0-4db5b87bdfefcdf9e5515814dd3ac1a6)
图1-20
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_62.jpg?sign=1739197313-vfmDn91d0ShiTwPWv6c5O9O0g9S55EpG-0-bbcac7df7c725e763d5564649309f7c5)
扫码查看彩色图
图1-20展示了X、Y、Z轴各自的旋转正方向,在后面的demo效果图中,我们也可以具体查看。
旋转过程中的示意图如图1-21所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_63.jpg?sign=1739197313-6ubxQaN02RAa45HmCxmEKDu9rx7tjoVa-0-df7e286699bb520bf4bd31504c9cd6ed)
图1-21
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_64.jpg?sign=1739197313-YCo4rq5tMOB2nHsr21SZPd4MZ6fEKZ2B-0-c6368932614f7fd45268f9f16c589836)
扫码查看彩色图
图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=1739197313-f6Babfc7lVyHSJmLeIjDUauKyRlWkR4e-0-24f02724f73b7cc94b3434e331700130)
效果如图1-22所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_66.jpg?sign=1739197313-GFOtMb7UOMI0Fs7zxEOzOiRXs9Yn9cjG-0-e9f2c70d105a5b023b77f4ce06129a0e)
图1-22
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_67.jpg?sign=1739197313-ECBAY9JiZ3tTwyfrK7XKeF9n0fdvhWFF-0-e631825030e2d36da0bc39adf92f716a)
扫码查看动态效果图
从图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=1739197313-kuBrSWmjuAao9SJqALHQAlCoUvrWrAH4-0-7f0812dbc4a5a8d10fd42ef2a2eb56fb)
效果如图1-23所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_69.jpg?sign=1739197313-FGgYZxbOMI6KAXL2bCv6bZ37oiEjBjej-0-d09fd4078a58a32d8ce63793d994ec5e)
图1-23
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_70.jpg?sign=1739197313-lSADGYNYNnVYnonlDDrNqRn2Awi5zLEh-0-83ca9a7f1a2d007ff629283afaf6502f)
扫码查看动态效果图
同样地,以坐标系原点为中心绕Z轴旋转。在图像旋转90°以后(大于90°且小于270°),图像就与View没有交集了,所以屏幕上没有任何图像,即屏幕上不显示任何内容。
4.调整旋转中心点
从上面的效果可以看出,默认都是围绕X、Y、Z轴旋转的,有时我们想实现翻转卡片的效果,扫码查看右侧效果图。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_71.jpg?sign=1739197313-pzGj6pCA3uSzCFt35wQlMNhUCKPwWnwg-0-ad2afff832c316cf71008b46bb49188f)
扫码查看动态效果图
在这个示例中,很明显,旋转中心点变为了图像中心点。那么怎么调整旋转中心点呢?
如果我们想将默认的3D坐标系中心点调整到(x,y)位置,只需要在获取矩阵后,通过下面的代码将中心点位置调整到(x,y)位置:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_72.jpg?sign=1739197313-BuZ2n90EtCNR6hmCI0nc3zRQCtnMM4tR-0-bec85179c3866168c60da357862a7bd2)
有关这段代码,我们会放在第2章讲解位置矩阵时详细说明,在这里,大家只要会用就行。但需要特别注意的一点是,这里是通过后期改变矩阵的值来改变旋转中心点的,并没有改变原始Camera的位置,Camera在View所在的2D坐标系中的投影位置依然在View的左上角(0,0)处。
比如,我们修改一下demo中的代码,将旋转中心点改为图像中心点:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_73.jpg?sign=1739197313-IvPnGU4g0rUzokMXcW862fWg83lXBZaq-0-0aa52197eaab9b617e18d1963825a72c)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_74.jpg?sign=1739197313-k2oepohYInl9EsdE4GP5teuRKGhimaOz-0-68c00e99e0b7021d54d644a963e74e8d)
这段代码比较好理解,只是在操作了Camera以后,通过camera.getMatrix(matrix)获取对应操作的matrix数组,然后通过调整旋转中心点的代码,将旋转中心点调整到图像中心点。
调整中心点后绕X轴旋转的效果如图1-24所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_75.jpg?sign=1739197313-SstEGUPs4PUbqnltAGf8JQ1suTSLGcVW-0-f7c8fa0383ffaee96258dca8387f9a0e)
图1-24
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_76.jpg?sign=1739197313-UiFre2HPY4dzvBZhx55XGfuIcluf1xDE-0-83acf61a277be6425618c160c2d7938c)
扫码查看动态效果图
同样地,调整旋转中心点到图像中心点后,绕Y轴旋转的效果如图1-25所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_77.jpg?sign=1739197313-DH4mb7D4kis5tOt6vSD2oyNfpYm9HV9z-0-6530bfd96e29cf2286c6771765bcd5c5)
图1-25
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_78.jpg?sign=1739197313-6iQYfArXBY4zxpOu9lPRtuJ5H91KbJxh-0-976bd26e2caeebf6e9cde377e60b893a)
扫码查看动态效果图
最后,再来看看在调整旋转中心点到图像中心点后,绕Z轴旋转的效果如图1-26所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_79.jpg?sign=1739197313-hfqrCb99VrMSxHyLNr3Tgtb1S8s7CItI-0-3ef541b8bedc496b22f786245aeb34f0)
图1-26
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_80.jpg?sign=1739197313-0ZDicJbBZCCEDFXRNyIH50LLFNxqI545-0-90396501daa3bc2bda6f15b31ba890e6)
扫码查看动态效果图
1.2.3 改变Camera的位置
在API≥15时,Camera类新增了几个函数来获取和改变Camera的位置:
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_81.jpg?sign=1739197313-1vMF2Kl648lXx1zx4Zwnhn86q8U6EGJc-0-c05d3c065b41fb9288527cbf4483d5fa)
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=1739197313-9YVOJrW8xzL1TJs6v6axpjhaxhVjyc5q-0-8cd6b372eceb2cf7d6e58be447f111c0)
日志如图1-27所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_83.jpg?sign=1739197313-0r7th9qK1YaNkHUOqoOG6V5Tvq88OyUw-0-2e3ffbdc79d2eb0aa9547daaa2dfe94e)
图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=1739197313-Sler1ufZW4etOKKHdNmWJA72918mSBsD-0-625cf0e26746c41b23e20df5423583bf)
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_85.jpg?sign=1739197313-cbdVWp8tXBtSbuA77ZSdmILgv84hTYBj-0-e6d1bbd7fdf8b47bcc4191a17806337a)
从上面的代码可以看出,我们通过getWidth()/2得到了中心点位置的坐标,然后除以72换算成英寸单位。需要注意的是,Y轴的正方向是沿着屏幕向上的,所以,我们若要让Camera向下移动,需要将移动距离设置为-centerY。
效果如图1-28所示。
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_86.jpg?sign=1739197313-OSxzFPWTUzt92X8QfbFZU16U7ondf6i3-0-724b2ecb191ea844cf5b3dde5c70d4d1)
图1-28
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_87.jpg?sign=1739197313-hv3nxORmhsXTOOo3c6h4q68dYtZOmWWv-0-a981747a97ed8f47f28d0f1b1fdccbb2)
扫码查看动态效果图
这里有两点需要注意:
(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=1739197313-UUzXlR0tpXGXRokvY3ttZ8dlCGBVe6XB-0-df201ab50b8cf8e86a767df453a54628)
图1-29
![img](https://epubservercos.yuewen.com/0CBE40/19391577408683706/epubprivate/OEBPS/Images/txt001_89.jpg?sign=1739197313-4Uklk93ula1g9TWem6k1GH3JORu1Gfee-0-b51ec109a905de756f410302fc09d4ba)
扫码查看彩色图
在图1-29中,红色框表示当Camera在图像左上角外部时显示的图像范围,此时,整个图像都可以得到显示;绿色框表示在Camera移到图像中心点外部以后,显示范围随着Camera移动的情况。从这个示意图可以看出,在Camera移到图像中心点外部以后,只能显示右下角部分的图像,与代码运行效果相同。
Camera的移动与图像显示理解起来相对有些难度,大家可以把A4纸当作View,把手机摄像头当作Camera,通过移动手机摄像头来查看手机屏幕中显示内容的变化情况,两者的原理完全相同。