针对不同DPI的OpenGL表面视图缩放

时间:2012-02-04 19:52:32

标签: android opengl-es android-ndk scaling hdpi

我有一台800x480分辨率的设备。当我创建GLSurfaceView时,我得到一个onSurfaceChanged调用533x320(显然应用了1.5 HDPI修改器)并且表面被放大了。因此,当我绘制1像素粗线时看起来非常糟糕,而且我无法进行像素完美渲染。

我想要的是原始分辨率表面(800x480)。

以这种方式创建视图(例如在NDK OpenGL示例中),在Activity onCreate中创建

    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

    view = new MyGLSurfaceView(this);
    setContentView(view);

我没有使用任何布局等。

2 个答案:

答案 0 :(得分:4)

我找到了解决方案:当我添加

<uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"/>

到AndroidManifest.xml,我得到了适当的解析。说实话,Android在iOS上使用几年后对我来说是一个非常奇怪的平台......

此处找到解决方案:MonoDroid apps don't use correct density drawables

答案 1 :(得分:0)

问题的根源似乎在于onSurfaceChanged命令向下传递(可能是改变的)宽度和高度。

构建视图的代码可能没有任何问题,但我们希望确保它是在实际的设备分辨率下构建的。 也许明确地用所需的宽度和高度调用setLayout (int width, int height)可以让你获得更好的里程......

显然,在执行此操作之前,您必须确定实际的屏幕尺寸。获得实际物理像素的最佳选择是使用DisplayMetrics的widthPixels和heightPixels:http://developer.android.com/reference/android/util/DisplayMetrics.html

如果这不起作用,或许在不同的设备上尝试您的代码可能会产生正确的结果。在这种情况下,它可能是与设备相关的问题......