不同DPI的OpenGL表面视图缩放

8
我有一个800x480分辨率的设备。当我创建GLSurfaceView时,我会收到一个533x320(显然应用了1.5 HDPI修饰符)的onSurfaceChanged调用,并且表面被放大。因此,当我绘制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);

我不使用任何布局等。

你能贴一些代码吗,比如这个GLSurface视图所使用的布局?我不能从空气中得出答案。 - Kevin Parker
当然,我会将其添加到问题中。 - Mark
2个回答

5
我找到了解决方案:当我添加以下代码时
<uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"/>

我在 AndroidManifest.xml 中添加了以下代码,解决了分辨率问题。说实话,经过几年的 iOS 开发后,Android 平台对我来说非常陌生...

解决方法见此处:MonoDroid 应用程序未使用正确的密度可绘制资源


哦,那就是Android设备的碎片化在起作用了... 不管怎样,清单文件做得不错。 - Erik

0
问题的根源似乎在于onSurfaceChanged命令传递了(可能已更改的)宽度和高度。
构建视图的代码可能没有问题,但我们希望确保它是按照实际设备分辨率构建的。 也许通过明确调用setLayout(int width, int height)并使用期望的宽度和高度,可能会得到更好的结果...
显然,在执行此操作之前,您必须确定实际的物理屏幕大小。而要获得实际的物理像素,则最好使用DisplayMetrics中的widthPixels和heightPixels:http://developer.android.com/reference/android/util/DisplayMetrics.html 如果这不起作用,可能尝试在不同的设备上运行您的代码会产生正确的结果。在这种情况下,可能是一个与设备相关的问题...

我已经尝试过了,但令人惊讶的是,DisplayMetrics 似乎也是错误的。HTC Desire Z 的结果为:widthPixels 533、heightPixels 320、xdpi 254.000000、ydpi 254.000000、density 1.500000、densDPI 240(设备具有本机分辨率 800x480)。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接