确定精确的眼睛视图大小

Pau*_*sma 6 android google-cardboard

在我的Android Cardboard应用程序中,我希望在每个眼睛中心显示一个叠加.简单地创建一个具有两个居中视图的LinearLayout非常简单,适用于大多数手机,因为眼睛最适合:

CarboardView中的视频

如果情况并非如此,那么让每个眼睛的中心成为一个问题.使用平板电脑时最清楚地说明了这一点:

以CardboardView的眼睛为中心

我试图在每个眼睛视图中居中显示消息"缓冲,0%......".

眼睛的渲染框的大小具有固定的尺寸(当然,因为人眼之间的距离具有相当固定的尺寸).不幸的是,CardboardView似乎没有提供有关眼睛的确切大小和/或位置的信息.

我已经研究过获得左眼和右眼cardboardView.getCurrentEyeParams()(奇怪的未记录),每个眼睛都包含一个视口.这似乎给出了大小和位置,但其值似乎与屏幕上的大小和位置没有直接关系.

在屏幕分辨率为1920×1080的LG G2上,视口为:

Viewport left: {
    x: 0,
    y: 0,
    width: 1150,
    height: 1177,
}
Viewport right: {
    x: 1150,
    y: 0,
    width: 1150,
    height: 1177,
}
Run Code Online (Sandbox Code Playgroud)

在屏幕分辨率为2048×1536的Nexus 9上,视口为:

Viewport left: {
    x: 0,
    y: 0,
    width: 802,
    height: 802,
}
Viewport right: {
    x: 802,
    y: 0,
    width: 802,
    height: 802,
}
Run Code Online (Sandbox Code Playgroud)

这两个尺寸(如果它们以像素为单位)比显示的实际图像大得多,并且在LG G2的情况下,宽度和高度确实大于1080px的屏幕尺寸.

看一下Cardboard SDK的一些反编译代码,看来眼睛周围的渐晕方形是通过一个名为DistortionMesh的内部类绘制的,并通过一些有些复杂的代码呈现.(注意,通过反编译似乎缺少某些逻辑,例如第195和199行.)

Viewport的创建表明这些值确实是像素(以米为单位的偏移量乘以每米的像素数).也许DistortionMesh或EyeView矩阵在渲染之前应用于视口?无论如何,我觉得我没有找对地方.

我还看了一下获取ScreenParams,因为它也提供了宽度和高度.不幸的是,这会返回两个设备上的整个屏幕尺寸,但似乎并不相关.

我当前的方法叠加是一个自定义ViewGroup,它通过child.layout()使用ScreenParams的高度和宽度的一半来调用两个孩子.

我怎样才能知道Eye被吸引到StereoRenderer的大小?我可以找到一种不同的方式来将眼睛中的不同视图居中吗?