在我的Android Cardboard应用程序中,我希望在每个眼睛中心显示一个叠加层。简单地创建一个具有两个居中视图的LinearLayout非常简单,适用于大多数手机,因为眼睛最适合:
如果情况并非如此,那么在每只眼睛中居中都会成为一个问题。使用平板电脑时最清楚地说明了这一点:
我正试图在每个眼睛视图中居中显示消息“缓冲,0%......”。
眼睛的渲染框的大小具有固定的尺寸(当然,因为人眼之间的距离具有相当固定的尺寸)。不幸的是,CardboardView似乎没有提供有关眼睛的确切大小和/或位置的信息。
我已经研究过通过cardboardView.getCurrentEyeParams()
(奇怪的未记录)获得左眼和右眼,每只眼睛都包含Viewport。这似乎给出了大小和位置,但其值似乎与屏幕上的大小和位置没有直接关系。
在屏幕分辨率为1920×1080的LG G2上,视口为:
Viewport left: {
x: 0,
y: 0,
width: 1150,
height: 1177,
}
Viewport right: {
x: 1150,
y: 0,
width: 1150,
height: 1177,
}
在屏幕分辨率为2048×1536的Nexus 9上,视口为:
Viewport left: {
x: 0,
y: 0,
width: 802,
height: 802,
}
Viewport right: {
x: 802,
y: 0,
width: 802,
height: 802,
}
这两个尺寸(如果它们以像素为单位)远大于显示的实际图像,而在LG G2的情况下,宽度和高度确实大于1080px的屏幕尺寸。
查看Cardboard SDK的一些反编译代码,看来眼睛周围的渐晕方形是通过名为DistortionMesh的内部类和is rendered through some somewhat complex code绘制的。 (注意,通过反编译似乎缺少某些逻辑,例如第195和199行。)
视口的创建表明这些值确实是像素(以米为单位的偏移量乘以每米的像素数)。也许DistortionMesh或the EyeView matrix在渲染之前应用于视口?无论如何,我觉得我没有找对地方。
我还看了一下获得ScreenParams,因为它也提供了宽度和高度。不幸的是,这会返回两个设备上的整个屏幕尺寸,并且似乎也不相关。
我当前的方法叠加层是一个自定义ViewGroup,它使用ScreenParams的高度和宽度的一半通过调用child.layout()
来居中两个孩子。
我怎样才能弄清楚眼睛被吸引到StereoRenderer的大小?我能找到一种不同的方式来将不同的视角集中在眼睛中吗?