在Android上重复使用不同屏幕大小和密度的可绘制图像

在Android上重复使用不同屏幕大小和密度的可绘制图像,android,alias,android-drawable,android-bitmap,xml-drawable,Android,Alias,Android Drawable,Android Bitmap,Xml Drawable,上下文: 我正在为平板电脑(景观)开发一个Android应用程序,图像资源的分辨率为1920x1200。该分辨率适用于以下屏幕尺寸和密度: drawable-xlarge-hdpi drawable-large-xhdpi 问题: 如果我在这两个文件夹中包含所有复制的图像资源,APK的最终大小将不必要地过大 我失败的方法: 我尝试使用Alias作为此处定义的绘图工具: 我的图像资源位于: res/drawable-nodpi/image_cmn.png 以及相应屏幕大小和密度文件夹中的两个

上下文:
我正在为平板电脑(景观)开发一个Android应用程序,图像资源的分辨率为1920x1200。该分辨率适用于以下屏幕尺寸和密度:

drawable-xlarge-hdpi
drawable-large-xhdpi
问题: 如果我在这两个文件夹中包含所有复制的图像资源,APK的最终大小将不必要地过大

我失败的方法: 我尝试使用Alias作为此处定义的绘图工具:

我的图像资源位于:

res/drawable-nodpi/image_cmn.png
以及相应屏幕大小和密度文件夹中的两个别名:

res/drawable-xlarge-hdpi/image.xml
res/drawable-large-xhdpi/image.xml
image.xml:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/image_cmn" />

当然,当我在布局文件中使用图像时,我会引用别名:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/image" />

但遗憾的是,Android没有适当调整我的测试平板电脑(mdpi)的资源大小,结果是我的图像变大了

我尝试将原始png移动到res/drawable,甚至移动到res/raw,但结果与res/drawable nodpi相同

如果我将这个png移动到res/drawable xlarge hdpi(与xml别名相同),结果是正确的,但这并不能解决我的问题,因为我还必须将它们复制到res/drawable大型xhdpi,并且apk大小会增加


有人知道如何做到这一点吗?

如果您想在所有尺寸的设备上使用相同的图像,那么我认为您必须使用9-Patch图像。

这里是Android的官方文章

之前:

之后:

请参阅:


希望有帮助。

我尽量避免在ImageView上使用wrap_内容,因为不同的平台版本会以不同的方式调整图像的大小,如果在dp中设置明确的宽度和高度,则选择哪幅图像并不重要

在您的情况下,我将使用drawable/xhdpi中的单个图像。在dp中的布局文件中指定其宽度和高度。对于一个1920x1200px的图像,它将是layout\u width=“960dp”layout\u height=“600dp”

在x-large平板电脑上,图像的物理尺寸与大型平板电脑大致相同

如果您希望x-large平板电脑上的图像更大,请包含第二个布局文件,其中图像的宽度和高度会增加,但保持相同的图像

或者,您可以使用不同于大型和x大型的维度资源。

这样如何:

  • 将所有图像资源放入
    res/drawable nodpi
  • 将不同的布局文件放入
    res/layout xlarge
    res/layout large
    res/layout
  • ImageView
    上使用此图像时,不要使用
    match\u parent
    wrap\u content
    ,而是使用dp中的计算大小

  • 这应该是可行的,但是,缺点是它不使用,这意味着在dpi较低的设备上,它会消耗更多内存。

    如果你想在所有尺寸的设备上使用相同的图像,那么我认为你应该在android的线性布局中使用9个补丁图像,每个布局包含权重标签。我认为这是100%的工作。我敢肯定。因为我将这种方法用于通用应用(意味着平板电脑和设备应用)

    好的,我明白你的问题。我保证与这个问题相关

    有两种方法,我都推荐

    第一种方式(与您当前的问题相关更方便。)

    如果大小变大,则上载多个apk

    跟着

    第二种方式我更喜欢用这种方式

    创建多个布局。如下

    res/布局/main_activity.xml--->#适用于手机(小于600dp的可用宽度)

    res/layout-sw600dp/main_activity.xml-->#适用于7英寸平板电脑(600dp宽和更大)

    res/布局-sw720dp/main_activity.xml#适用于10英寸平板电脑(720dp宽且更大)

    我强烈建议你读每一个单词


    谢谢。

    我可以为这个问题提出两种解决方案:

    第一个:

  • 将所有图像放入“资源”文件夹。按分辨率将它们拆分到文件夹中
  • 编写自己的逻辑以确定当前设备的分辨率和/或大小
  • 以确定的分辨率从文件夹中拾取图像
  • 将其设置为代码中的
    ImageView
  • 第二个(很难看,但很快):


    只需使用压缩工具压缩png图像。它可以在不降低质量的情况下(对于移动设备)最多减少70-80%的图像。

    通常,我们仅对可绘制资源使用密度限定符。您真的不需要添加large/xlarge,因为这两个工具只处理布局资源。(顺便说一句,我从来没有看到它们一起使用过)@sutianshi:不,根据屏幕大小使用不同的绘图工具也是合理的。例如,谷歌是在平台上实现这一点的,其资源目录类似于
    res/drawable-sw600dp-hdpi/
    “分辨率适合以下屏幕大小和密度”——1920x1200与屏幕大小几乎没有关系。例如,我希望在今年晚些时候看到
    -正常的
    设备运行这种分辨率(或更高的分辨率)。@commonware我同意,手机也可以有这种分辨率。在这种情况下,我只需要开发平板电脑,所以这些是我需要的文件夹我有完全相同的问题,图像太大时,使用别名,这种方法基本上是无用的绘图。。。谷歌怎么能将这种东西发布到生产中呢?对于可以拉伸到具体像素的简单图像来说,这是一个很好的解决方案,但对于完整图像(如照片)来说,这恐怕是唯一的解决方案。我一点也不高兴(关于这个android问题),因为这种方法会增加低分辨率设备上的内存消耗。你可以将我的方法与你的方法结合起来,使用xml别名来选择你想要的图像,然后在布局中使用显式的dp大小来控制可视化运行时的大小调整。T