【问题标题】:Vector Drawables sometimes become blurryVector Drawables 有时会变得模糊
【发布时间】:2018-10-17 02:25:19
【问题描述】:

我正在开发一个需要更新的现有应用程序,一旦我用矢量可绘制对象替换了一些 png 图标,就会发生非常奇怪的事情:

这些矢量绘图有时会变得模糊。我说有时是因为它们并不总是模糊的。

例如,我有一个带有几张卡片的回收器视图,每张卡片都包含一些图标和其他元素。一切看起来都很好。但是,如果显示插页式广告,当我关闭它时,这些图标会变得模糊。如果我向下滚动回收站视图,然后再次返回,图标会清晰地重绘,现在它们看起来又好又锐利。

另一个例子:我有一个工具栏,右边有一个图标菜单(经典镜头),左边有一个后退箭头(两者都是矢量可绘制的)。如果用户点击图标,那么工具栏会变成搜索视图,并且键盘会出现......但后退箭头现在变得模糊。一旦我在搜索视图中输入第一个字母,图标就会恢复良好且清晰。

这只是两个示例,但在应用程序的许多其他部分都会发生。

在我的 gradle 中

android {
compileSdkVersion 27
defaultConfig {
    applicationId '...'
    minSdkVersion 21
    targetSdkVersion 27
    versionCode 12310106
    versionName '4.1.1'

    renderscriptTargetApi 21
    renderscriptSupportModeEnabled true
    vectorDrawables.useSupportLibrary = true

我快疯了,你知道吗?

更新

事实证明,如果我在 Drawables 上调用 invalidateSelf(),那么问题就消失了,它们看起来又好了。 我不想让每个 Drawable 都失效,我不认为这是一个解决方案

【问题讨论】:

  • 我尝试在一个 ImageView 上同时使用 srcCompat 或 src,如果是你的意思,但没有任何改变:(

标签: android drawable blurry android-vectordrawable


【解决方案1】:

这可能看起来迟了,但我实际上找到了一个非常简单的解决方案,只需声明一个常规的 Drawable xml,我发现它不会超过 4kbs 而不是另一个矢量资产,并将您的矢量资产作为可绘制项目并使用作为另一个用于多次绘制同一图像的 xml 没有模糊 像这样:-

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

如果它在同一个活动中为每次抽奖声明更多。

对我来说,模糊仅在设备锁定或打开软键盘时发生,而不是使用相同的 XML。

【讨论】:

    【解决方案2】:

    查明原因后,我找到了原因。因为您在多个维度上使用相同的矢量图像。例如,如果您有 2 个 100 dp x 100 dp 和 50 dp x 50dp 的图像,则必须创建 2 个具有不同名称的矢量图像,即使您切换到另一个活动,也不得在多个尺寸上使用 1 个矢量图像。例如,Activity A 有一个 50 dp x 50 dp 的图像,您使用相同的图像矢量打开带有 100dp x100 dp 图像的 Activity B,然后您返回到 Activity A 图像将被变形。 原因是Android操作系统优化了性能,对存储在缓存中的图像,尤其是弱配置设备。 (总而言之,如果在多个维度上使用矢量图像,则必须对其进行不同的命名。)

    【讨论】:

    • 你能提供一个 POC,一个 github repo 来克隆将是完美的(这对我来说很有意义,图像必须在某些时候处理)
    • 让我明白,我必须确保在应用程序生命周期内不会调整矢量可绘制对象的大小。如果发生这种情况,我必须创建不同的版本才能正确显示,对吧?
    • 是的,如果你想显示最好的向量
    【解决方案3】:

    当你给出一个固定大小的图像视图时,可能会发生这种情况。但是当您使用 wrap content 的宽度和高度时,它可能会很小,并且可能需要更大。因此,如果您需要更大的图像而不模糊,您可以非常轻松地自定义 vectorDrawable 资源。当您从 android studio 收集资产时,可以选择覆盖大小。

    【讨论】:

    • 许多“Guilty”图标只是使用 Android Studio Vector Assets 创建的默认图标。例如,我使用了提供的镜头图标,默认大小为 24dp。我认为工具栏图标就足够了,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多