1

阅读以下内容后:

http://developer.android.com/guide/practices/screens_support.html

如何将 ppi 转换为 Android 图像的 dpi?

我假设“dp = px / (dpi / 160)”。我在 LDPI 屏幕上测试了它,它运行良好,我的第一个想法是“终于,一个突破!”,但后来在 HDPI 屏幕上测试后发现它并没有那么好用。所以然后我尝试了“dp = px * (dpi / 160)”并发现它不起作用,并不是我认为它会......我尝试了其他几个公式,但没有一个起作用。其中之一是只在小屏幕上使用 dp,然后只为其他屏幕获取屏幕 px。那没有用。

显然,在阅读了如何支持多个屏幕之后,我想使用 DP 来获得正确的宽度和高度。我不太清楚为什么这会失败,所以我为什么转向你。

这是我的代码:

public class Scale {

    ScreenType type;
    Display display;

    public Scale(WindowManager wm) {
        this.display = wm.getDefaultDisplay();

        // Get Display Type //
        DisplayMetrics metrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(metrics);
        int density = metrics.densityDpi;
        switch(density) {
            case DisplayMetrics.DENSITY_LOW:
                this.type = ScreenType.LDPI;
                break;
            case DisplayMetrics.DENSITY_MEDIUM:
                this.type = ScreenType.MDPI;
                break;
            case DisplayMetrics.DENSITY_HIGH:
                this.type = ScreenType.HDPI;
                break;
            default:
                this.type = ScreenType.XHDPI;
                System.exit(0);
                break;
        }
    }

    public ScreenType getScreenType() {
        return this.type;
    }

    public int getWidth() {
        return this.display.getWidth();
    }

    public int getHeight() {
        return this.display.getHeight();
    }

    public int getDPWidth() {
        float dp = this.getWidth() / (this.getScreenType().getDensity() / 160f);
        return (int) dp;
    }

    public int getDPHeight() {
        float dp = this.getHeight() / (this.getScreenType().getDensity() / 160f);
        return (int) dp;
    }

}

ScreenType 枚举如下:

public enum ScreenType {
    LDPI(120), MDPI(160), HDPI(240), XHDPI(320);

    private final int density;
    ScreenType(int density) {
        this.density = density;
    }

    public int getDensity() {
        return this.density;
    }
}

我知道我不需要 ScreenType 枚举,但目前不谈论这个。只需要弄清楚为什么屏幕总是尺寸错误。

现在,当我去绘制背景时,我会执行以下操作...

batcher.beginBatch(Assets.loadingAtlas);
for(int x = 0; x <= this.scale.getDPWidth(); x += 50) {
    for(int y = 0; y <= this.scale.getDPHeight(); y += 50) {
        batcher.drawSprite(x, y, 50, 50, Assets.backgroundPattern);
    }
}
batcher.endBatch();

然后它转到具有以下代码的批处理器...

public void beginBatch(Texture texture) {
    texture.bind();
    numSprites = 0;
    bufferIndex = 0;
}

public void drawSprite(float x, float y, float width, float height, TextureRegion region) {
    float halfWidth = width / 2;
    float halfHeight = height / 2;
    float x1 = x - halfWidth;
    float y1 = y - halfHeight;
    float x2 = x + halfWidth;
    float y2 = y + halfHeight;

    verticesBuffer[bufferIndex++] = x1;
    verticesBuffer[bufferIndex++] = y1;
    verticesBuffer[bufferIndex++] = region.u1;
    verticesBuffer[bufferIndex++] = region.v2;

    verticesBuffer[bufferIndex++] = x2;
    verticesBuffer[bufferIndex++] = y1;
    verticesBuffer[bufferIndex++] = region.u2;
    verticesBuffer[bufferIndex++] = region.v2;

    verticesBuffer[bufferIndex++] = x2;
    verticesBuffer[bufferIndex++] = y2;
    verticesBuffer[bufferIndex++] = region.u2;
    verticesBuffer[bufferIndex++] = region.v1;

    verticesBuffer[bufferIndex++] = x1;
    verticesBuffer[bufferIndex++] = y2;
    verticesBuffer[bufferIndex++] = region.u1;
    verticesBuffer[bufferIndex++] = region.v1;

    numSprites++;
}

public void endBatch() {
    vertices.setVertices(verticesBuffer, 0, bufferIndex);
    vertices.bind();
    vertices.draw(GL10.GL_TRIANGLES, 0, numSprites * 6);
    vertices.unbind();
}

然后,当您绘制顶点时,将使用以下代码...

public void draw(int primitiveType, int offset, int numVertices) {        
    GL10 gl = glGraphics.getGL();

    if(indices!=null) {
        indices.position(offset);
        gl.glDrawElements(primitiveType, numVertices, GL10.GL_UNSIGNED_SHORT, indices);
    } else {
        gl.glDrawArrays(primitiveType, offset, numVertices);
    }        
}

现在我最大的两个问题是:第一,我是否使用正确的公式来计算我应该在哪里绘制以及我应该绘制多少次背景?二,当我绘制元素以将 dp 放回像素时,我应该有一个公式吗?

当我失败时会发生以下情况:

背景_HDPI_SCREEN.png

黄色标记可以有黑色,蓝色 X 标记不能有黑色。蓝色应该比现在延伸得更远。

我从数学上理解为什么会发生这种情况,但感觉可能有一个更好的公式适用于 LDPI 和 HDPI 屏幕,而不仅仅是 LDPI。这个公式还使它在 MDPI 上稍微小了一点。

数学是与密度无关的像素 (DP) = WIDTH / (DENSITY / 160)。所以一个例子是 DP = 800/(240/160) = 800/1.5 = 533

所以你的想法是什么?

提前感谢您的任何意见!如果你想要一个 SSCCE,请告诉我,但这个实例需要一些时间,我希望我们不需要这样做。

4

0 回答 0