【问题标题】:how to use drawable to compatible with all screen sizes (idpi, mdpi, hdpi, xhdpi, xxhdpi)如何使用drawable兼容所有屏幕尺寸(idpi、mdpi、hdpi、xhdpi、xxhdpi)
【发布时间】:2014-03-20 10:26:43
【问题描述】:

您好,我是 android 编程新手,所以我想知道:

如何使用drawable兼容所有屏幕尺寸(idpi、mdpi、hdpi、xhdpi、xxhdpi)

实际上我对可绘制屏幕尺寸与所有屏幕尺寸的兼容性感到困惑

所以我想知道:

如果我希望我的应用兼容所有屏幕尺寸,是否需要将图像放入每个可绘制文件夹中

例如:背景图片

  • • drawable-ldpi(QVGA 设备 2.7 为 240x320)将图像放入此 分辨率
  • • drawable-mdpi(HVGA 设备 3.2 为 320x480)用这个放置图像 分辨率
  • • drawable-hdpi(对于 WVGA 设备 4.0 为 480x800)用这个放置图像 分辨率
  • • drawable-xhdpi(WxVGA 设备 4.7 为 1280x720)用这个放置图像 分辨率
  • • drawable-xxhdpi(Nexus 5 设备为 1080x1920)放置图像 本决议

或者我可以为所有屏幕尺寸使用同一张图片。

【问题讨论】:

  • 您必须制作不同的图像并将每个图像放在不同的文件夹中。所有图像将具有相同的名称,但大小和分辨率不同。您还可以制作(但我不鼓励您这样做)一个独特的 xxhdpi 文件夹,其中包含 480 dpi 图形。我不鼓励你,因为 Android 缩放是 1:在 CPU 使用率方面更昂贵,2:它会导致 最糟糕的结果

标签: android android-layout android-drawable android-resolution


【解决方案1】:

您不需要在每个可能的drawable 文件夹中创建图像。只需提供一张图片并将其放入drawable 文件夹即可。此图像将根据您的使用情况自动缩放。

但这不会在所有屏幕上提供良好的质量,并且计算(缩放)可能更昂贵。 建议您可以为不同的屏幕密度提供单独的图像(例如drawable-mdpidrawable-hdpi 等),并且想法是它们应该具有与屏幕密度匹配的不同分辨率。

【讨论】:

  • 不正确!!为每个 dpi 提供可绘制对象是获得清晰图像的唯一方法。
  • @MarkBuikema 问题在于是否可以使用一张图片,而不是推荐的图片。无论如何,我编辑了我的问题,以明确展示更好的方法。
【解决方案2】:

只有为每个 dpi 提供可绘制对象,您的图像才会看起来清晰明快。不再支持 Ldpi,因此您可以忽略 ldpi。

此外,对于您的启动器图标,请提供 xxxhdpi 图像。在 Kit Kat 上运行并具有全高清屏幕的平板电脑会在启动器中使用这些图像。

创建 1 个可绘制对象并将其放入 drawable 文件夹是不好的做法!您的图像会看起来很模糊。

【讨论】:

    【解决方案3】:

    对于这种情况,我有一个非常好的方法,就像一个魅力。您只需要为您创建一个高清图像,然后方法就可以解决所有问题。

    方法如下:

    /**
     * Get DRAWABLE with original size screen resolution independent
     * @param is Input stream of the drawable
     * @param fileName File name of the drawable
     * @param density Density value of the drawable
     * @param context Current application context
     * @return Drawable rearranged with its original values for all
     * different types of resolutions.
     */
    public static Drawable getDrawable(InputStream is, String fileName, int density, Context context) {
        Options opts = new BitmapFactory.Options();
        opts.inDensity = density;
        opts.inTargetDensity = context.getResources().getDisplayMetrics().densityDpi;
        return Drawable.createFromResourceStream(context.getResources(), null, is, fileName, opts);
    }
    

    在这里,您必须为您的图像文件准备输入流,并在您的任何使用区域设置适合您的屏幕的密度。密度越小质量越低,通过改变数值来解决。以下是使用该方法的一些示例:

    1) 从 assets 文件夹中打开一个资源:

    getDrawable(assetManager.open("image.png"), "any_title", 250, context)
    

    2) 从drawables文件夹中打开一个drawable: 首先,您必须为您的输入流提供此方法: a) 方法:

    /**
     * Get InputStream from a drawable
     * @param context Current application context
     * @param drawableId Id of the file inside drawable folder
     * @return InputStream of the given drawable
     */
    public static ByteArrayInputStream getDrawableAsInputStream(Context context, int drawableId) {
        Bitmap bitmap = ((BitmapDrawable)context.getResources().getDrawable(drawableId)).getBitmap();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] imageInByte = stream.toByteArray();
        return new ByteArrayInputStream(imageInByte);
    }
    

    和用法: b) 用法:

    getDrawable(getDrawableAsInputStream(getBaseContext(), R.drawable.a_drawable), "any_title", 250, context)
    

    希望有用。

    【讨论】:

    • 这似乎是在缩放图像,如果图像位于 'drawable' 文件夹的根目录中,这显然是操作系统所做的。您是否将生成的渲染质量和速度与内置缩放进行了比较?
    • 是的,但是如果你不使用'drawable'文件夹的根目录,你可以使用我的方法
    【解决方案4】:

    您必须创建多种尺寸的图像。例如: 假设您有 48dp x 48dp 的 ImageView。 基于此尺寸,您必须创建尺寸为:

    1. 48x48px(100% - mdpi)
    2. 64x64px(150% - hdpi)
    3. 96x96px(200% - xhdpi)

      等等,如果你必须支持更多。

    注意: 无需创建 ldpi (75%) 分辨率图像,因为您的 hdpi 只会缩小两倍。

    如果您对多个 dpi 使用一种尺寸,则某些分辨率的质量可能会很差。

    【讨论】:

    • 这不正确,可能建议为每个文件夹创建不同的图像但不是强制性的。
    • 如果您不关心显示质量,那么是的,它不是
    • @Autocrab: 我的图片分别是 drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi 和 drawable-xxhdpi,比例分别为 0.75:1:1.5:2:3 .对于大多数模拟器,图像显示得非常好,但对于其中一些模拟器,图像没有以适当的比例出现。类似图像在 3.2 英寸 HVGA 滑块 (ADPI) 模拟器 - 320x480 mdpi 中显示良好,但图像在 5.1 英寸 WVGA 模拟器 - 480x800 mdpi 中显示不佳。尽管两者都是 mdpi。你能帮忙吗?
    【解决方案5】:

    您还可以使用 Android Asset Studio,您可以在其中上传图像,它会生成您需要的所有类型的分辨率图像。它甚至可以用于为您的应用程序创建动画和图标。链接在这里: https://romannurik.github.io/AndroidAssetStudio/index.html

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多