【问题标题】:Android image scalingAndroid 图像缩放
【发布时间】:2011-02-26 11:36:13
【问题描述】:

我正在为 1.6 制作一个应用程序,但我遇到了 android 图像缩放问题,我有一张 480x295 的图片。

在中等屏幕上显示正确,但在大屏幕(480x800 或 480x854)上,它不会填满屏幕,android 将图像放大 1.5 倍,即只有 720x442。

因为 800 实际上是 1.67 而 854 是 1.78,我显然可以只为 drawable-hdpi 文件夹包含大图像,但图像已经是 1.5mb,比人们似乎喜欢的要大,我不能使用app2sd 因为我想支持 1.6。

有什么建议吗?

我只能想到三个选项: 1)包括更大的图像(但这可能会限制销售,并且显然会增加 apk 大小)

2) 制作 2 个版本,似乎是一个不错的解决方案,只是更难实施。

3) 更改为 1.5,并自己处理所有缩放。

编辑: 更多细节: 我正在使用画布和表面视图进行绘图 图片加载代码:

backgroundBMP = BitmapFactory.decodeResource(getResources(), R.drawable.background, null);

以及绘图代码:

canvas.drawBitmap(backgroundBMP, 0, 0, null);

【问题讨论】:

    标签: android image-scaling


    【解决方案1】:

    如果您想自己缩放图像,请放入一个副本:

    res/drawable-nodpi
    

    确保该资源不在其他文件夹中。

    像这样加载位图:

    Bitmap bitmap = BitmapFactory.decodeResource(
    
                        context.getResources(),
    
                        R.drawable.my_image
                    );
    

    像这样调整它的大小:

    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
    

    然后将其绘制到您的画布上:

    canvas.drawBitmap(bitmap, 0, 0, null);
    

    这是完成工作所需的最少知识。

    补充说明

    通常,Android 会根据当前屏幕密度从 res/drawable 文件夹之一中选择您的图像。

    大多数图像格式没有密度信息,因此 Android 根据加载位图的文件夹来假设位图的密度。

    这意味着它可以进行自己的缩放以匹配加载位图的密度与画布密度。

    Android 在您加载位图时检查和匹配密度一次,并在您绘制位图时再次

    当您进行自己的扩展时,您通常希望防止操作系统干扰。有几种方法可以做到:

    1.使用 res/drawable-nodpi

    这是我在上面的快速示例中概述的策略。如果您想将图像打包为资源,并且仍然自己控制缩放,请将其放在这里,并且只放在这里:

    res/drawable-nodpi
    

    如果您需要支持 Cupcake,请在每个文件夹中放置一份副本:

    res/drawable-nodpi-v4    
    res/drawable
    

    解码器会自动提供防止缩放的选项。 Android 然后将图像密度设置为与屏幕匹配,因此在您绘制时它也不会缩放。 The compiler will apply lossless compression to images placed in res/drawable-xxx folders

    2。使用 res/raw

    如果你把它放进去,你可以让编译器不改变它:

    res/raw
    

    但是你需要小心防止在运行时缩放:

    BitmapFactory.Options options = new BitmapFactory.Options();    
    
    options.inScaled = false; // Prevents scaling at decode time.
    
    Bitmap bitmap = BitmapFactory.decodeResource(
    
                        context.getResources(),
    
                        R.raw.my_image,
    
                        options
                    );
    
    bitmap.setDensity(Bitmap.DENSITY_NONE); // Prevents scaling at draw time.
    

    3.使用资产文件夹

    如果您将图像放在 assets 文件夹中,而不是 res 中,则可以使用真正的文件夹结构来组织它们。像这样加载位图资源:

    Bitmap bitmap = BitmapFactory.decodeStream(
    
                        context.getAssets().open(
    
                            "myfolder/my_image.png",
    
                            AssetManager.ACCESS_BUFFER
                        )
                    );
    

    编译器不会碰它,它加载时不缩放,它的密度设置为与屏幕匹配,所以当你绘制它时也不会缩放。

    (性能说明:在 Android 加载图像之前,它必须找到文件。A resource is faster to locate than an asset,因此如果您将图像打包为资产,可能会有一些性能损失。)

    【讨论】:

      【解决方案2】:

      如果您想扩展您的Bitmap,您可以在canvas.drawBitmap() 之前使用canvas.scale(scaleX, scaleY);。您可以计算纵横比并将其用作比例值。

      要补充的重要一点是,您可以使用<uses-sdk android:minSdkVersion="3" /> 使用“移动到SD 卡”功能,并且仍然支持minSdkVersion 指定的较低Android 版本。

      【讨论】:

      • 谢谢 Viktor,我以为它会限制应用程序。对于决定这样做的其他人,您需要将 default.properties 设置为 android-8,并将 android:targetSdkVersion 设置为 8,并将 android:installLocation="auto" 添加到清单文件的清单部分。
      【解决方案3】:

      就像 Viktor 建议的那样,你可以做一个 Canvas.scale()。您也可以使用 BitmapDrawable(设置为 View 的背景)绘制位图,然后为您完成缩放。

      【讨论】:

      • 问题是我至少有 50 张图像需要缩放,这是为了游戏,而 android 无法正确缩放。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多