【问题标题】:ImageView is pixelated on older Android devicesImageView 在较旧的 Android 设备上像素化
【发布时间】:2016-01-11 23:06:50
【问题描述】:

问题

我的 XML 中有一个这样的 ImageView:

                <ImageView
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:src="@drawable/ic_person_add"
                android:alpha="0.87" />

ic_person_add 是普通的Material design Vectoricon

在我的 Nexus 5 (Android 6) 上,图标缩放非常漂亮而且非常清晰:

然而,在 Note 2 (Android 4.4) 上,图标变得非常像素化和丑陋:

如何在每台设备上获得清晰的 ImageView(以 Vector 作为 src)?最好只使用 xml 解决方案。

我已经找到了:

  • 添加android:adjustViewBounds="true" -> 什么也没做
  • ImageView images seem pixelated and low quality -> 不适用于矢量
  • 设置 BitmapFactory.inscaled=false -> 仅适用于 xml,我不知道将其放在自定义 ImageView 类中的哪个位置。

【问题讨论】:

  • 也许你应该使用romannurik.github.io/AndroidAssetStudio tp 生成需要的尺寸
  • 在 ImageView 中为 android:layout_width 和 android:layout_height 使用 "wrap_content"。这将保留原始图标大小并且不会像素化
  • @piotrek1543 问题是,我不应该有不同的尺寸,因为图像是矢量图形。
  • @Fareya 在 Nexus 5 上,它也适用于 100dp 尺寸并且不会像素化。此外,由于它是矢量图形,它应该可以正确缩放到任何大小。
  • 检查文件夹中的图标 \path-to-your-android-sdk-folder\platforms\android-xx\data\res 并非所有图标都是 xml 形状。 png 图标在放大时会有质量损失。

标签: android xml imageview drawable


【解决方案1】:

真正的问题不是 Note 2 的 DPI,而是它的 Android 版本。

Mellvar 发布的链接指出:

一旦您的 res/drawable 中有 vectorDrawable 图像,Gradle 插件将在构建期间自动生成 API 级别 20 及以下的光栅 PNG 图像

所以我的 Android 6 设备确实有一个 Vectorgraphic 作为 ImageView 的源,所以它可以完美地放大它。 对于 Note 2(在 Android 5 之前的操作系统上运行)Android Studio 自动将我的 Drawables 文件夹中的矢量图形转换为 PNG。

您可以通过更改 VectorXML 中的转换后的 PNG 的大小

android:height android:width

在 dp 中,您的矢量图需要在 API 20 之前的设备上显示。所以在我的情况下(最大 100dp)我必须将值更改为:

<vector android:height="100dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="100dp">

【讨论】:

  • 如果你使用真正的 SVG 文件并使用库来读取它们会怎样?
【解决方案2】:

Nexus 5 的密度桶是 xxhdpi,而 Note 2(基于 this)是 xhdpi。这表明您的 xxhdpi 位图大小合适(或至少等于或高于所需大小),而 xhdpi 则不是。

如果您使用的是最新版本的 Android Studio 提供的 automatic conversion,您可能需要尝试手动栅格化矢量图像,看看这是否能解决问题。

如果您使用的是光栅图形,您可能需要为每个密度变体添加一些视觉元素,以了解实际使用的是哪一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2016-10-08
    • 2022-01-05
    • 1970-01-01
    • 2020-11-28
    • 2022-01-02
    相关资源
    最近更新 更多