在Android上扩展问题 - 为什么图片如此笨拙?

Leo*_*rak 12 android 2d game-development

我没有2D图形和游戏体验.我教了几百个错误和几十个小时.我从简单的装扮游戏开始.我使用Nexus 5x进行开发,屏幕看起来不错.当我完成一个里程碑时,我在大联想平板电脑和小巧的三星迷你手机上试玩游戏.它看起来很可怕.

在此输入图像描述

原始矢量PSD文件看起来很完美,PNG导出也没有任何问题.但是,当我缩放图片时,它是颠簸的.我知道它是位图.但是还有另一张我在其他地方缩放的图片,它看起来很好(两张图片都是32位):

在此输入图像描述

当我从Google Play玩一些游戏时,他们从未遇到过扩展问题.他们是如何实施的?他们使用载体吗?有一些技巧吗?

我把所有东西放到assets文件夹中,虽然花了1 MB.我反编译了一些apk,他们没有为每个分辨率设置变种.虽然他们很好地缩放图片.

一些源代码片段:

protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    this.w = w;
    this.h = h;
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

protected void onDraw(Canvas canvas) {
    if (baseBitmap != null) {
        double scale = Math.min((double) w / (double) figure.getW(), (double) h / (double) figure.getH());
        figure.setScaleRatio(scale);
        int sw = (int) (scale * figure.getW());
        int x = ((w - sw) >> 1);
        figure.setX(x);

        paintDressPart(canvas, figure, figure.getMain());
        if (displayedParts != null) {
            for (DressPart dressPart : figure.getParts()) {
                if (displayedParts.contains(dressPart.getId())) {
                    paintDressPart(canvas, figure, dressPart);
                }
            }
        }
    }
}

private void paintDressPart(Canvas canvas, Figure figure, DressPart part) {
    double scale = figure.getScaleRatio();
    int sh = (int) (scale * part.getH());
    int sw = (int) (scale * part.getW());
    int sdx = (int) (scale * part.getDestX());
    int sdy = (int) (scale * part.getDestY());
    scaledRect.set(figure.getX() + sdx, sdy, figure.getX() + sw + sdx, sh + sdy);
    Rect partRect = part.getRect();
    canvas.drawBitmap(baseBitmap, partRect, scaledRect, canvasPaint);
}
Run Code Online (Sandbox Code Playgroud)

如果您想亲眼看到它,我会在GitHub上准备完整的项目,以便您可以下载并自行运行:

https://github.com/literakl/DressUp

更新

缩小规模也很糟糕.但是由于Paavnet的评论,我意识到Paint非常重要.看图片上的差异:

在此输入图像描述

我在3,2"AVD图像上运行了演示应用程序.图片278x786缩放到107x303.

十月更新

我重写了应用程序以使用资源文件夹而不是资产.Android缩放图片,然后我再次重新缩放.虽然它看起来比我不使用Android资源扩展时更好.资源缩放图片看起来通常比未缩放的nodpi/assets图片好.

我发现mdpi效果最好.我甚至有xxhdpi图片,它看起来比mdpi更糟糕.我认为即使在xxhdpi设备上!但它可能是图片的一个麻烦,它没有很好地绘制.Android资源缩放可以平滑线条上的边缘.

Mah*_*raa 1

我遇到了同样的问题..缩放不是那么顺利..最佳标准方法

Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
Run Code Online (Sandbox Code Playgroud)

您可以在网络中找到更优化的尺寸转换器..但实际上我最终使用了最佳解决方案:

第一。使用 Vector SVG 资源..这是 100% 完美质量的工作。只需确保 SVG 元素与 android 兼容(请参阅:https ://developer.android.com/studio/write/vector-asset-studio.html )

优点:

  • 最好的质量
  • 有效尺寸
  • 可轻松编辑

缺点:

  • 并非所有元素都受支持。

或者

第二。提供高分辨率图像(xxxhdpi 一张就足够了)

优点:

  • 高品质

缺点:

  • 可能会导致性能问题

我希望这会有所帮助,”。