Android 支持库 23.2 矢量绘图模糊

Posted

技术标签:

【中文标题】Android 支持库 23.2 矢量绘图模糊【英文标题】:Android Support Library 23.2 vector drawables are blurry 【发布时间】:2016-06-15 20:45:32 【问题描述】:

最新版本的 android 支持库 (23.2) 增加了对矢量可绘制对象的支持。它似乎是通过在本机不支持矢量可绘制对象的平台上动态栅格化矢量来做到这一点的。

但是,光栅化图像似乎是固定大小,而不是取决于使用情况。这是一个例子。

矢量

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:
        android:
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm0,3c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zm0,14.2c-2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22z"/>
</vector>

布局

<ImageView
  android:layout_
  android:layout_
  android:id="@+id/imageView"
  app:srcCompat="@drawable/vector1"/>

矢量为 24dp x 24dp。它用于 128dp x 128dp 的 ImageView。在不支持矢量绘图的平台上,生成的图像是模糊的,因为矢量以 16dp 进行光栅化并调整为 128dp。

我发现的唯一解决方案是为每个预期大小创建一个单独的矢量可绘制对象。创建一堆只有高度和宽度变化的重复向量非常烦人。如果您希望 drawable 以 fill_parent 或以其他方式动态调整大小,这并不能解决问题。

必须在高级中几乎定义矢量图像的尺寸,这完全违背了首先使用矢量的好处。

有人有真正的解决方法吗?

【问题讨论】:

【参考方案1】:

矢量以 16dp 栅格化并调整为 128dp

直到23.1,Android 从提供的VectorDrawable 开始创建光栅图像。这件事在支持库的v23.2 中发生了变化。如果您正确设置了您的 build.gradle ,则会发生此行为。

如果您使用的是Gradle Plugin 2.0+,请添加

android   
   defaultConfig   
     vectorDrawables.useSupportLibrary = true  
      
  

如果您使用的是 1.5.0

 android   
   defaultConfig   
     generatedDensities = []  
    

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions   
    additionalParameters "--no-version-vectors"  
    
  

同步后,清理工作区并重新构建。你可以阅读更多关于它的信息here 和 here

【讨论】:

谢谢,我忽略了添加 generateDensities 部分,我根本没有意识到 gradle 可以光栅化图像。【参考方案2】:

在你的 XML 中增加 android:width,height。

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:
        android:

我在这里增加尺寸后,生成的 png 尺寸也增加了,图像看起来不再模糊了。

【讨论】:

谢谢,我已经在 Inkscape 中编辑了我的矢量源文件以增加它的大小并再次创建了 xml。现在不再模糊了。

以上是关于Android 支持库 23.2 矢量绘图模糊的主要内容,如果未能解决你的问题,请参考以下文章

在 ANDROID NOUGAT 上显示模糊图像的矢量绘图

如何使用 vectorDrawable 作为使用 Android 支持库 23.2 的推送通知的图标? setSmallIcon 给出错误

如何使用矢量绘图发布仅限平板电脑的 Android 应用程序

Android 安装包优化Android 中使用 SVG 图片 ( 使用 appcompat 支持库兼容 5.0 以下版本的 Android 系统使用矢量图 )

Sketch游戏卡牌揭秘(卡牌01)

缩放会导致像素化矢量绘图