AppCompatDrawableManager.get() 对比 VectorDrawableCompat.create()

AppCompatDrawableManager.get() vs VectorDrawableCompat.create()

我使用的是支持库版本 24.2.1,并已通过 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

启用支持向量

这些关于支持向量的函数有什么区别? 我使用的是 VectorDrawableCompat.create(getResources(), R.drawable.my_vector, null)。但是,当以编程方式在按钮上设置可绘制对象时,这不会在我的测试设备(Android 4.3)上产生可绘制对象,如下所示:

button.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);

使用 AppCompatDrawableManager.get().getDrawable(getActivity(), R.drawable.my_vector);(包裹在状态列表选择器中)似乎工作正常,尽管我似乎找不到它的文档。

What is the difference in these functions regarding support vectors?

AppCompatResources.getDrawable(...) 将膨胀各种可绘制对象,包括

  • 矢量可绘制对象低于 API 21(仅当构建脚本启用了支持矢量可绘制对象时;进一步阅读)
  • 主题正确的 AppCompat 可绘制对象
  • ContextCompat.getDrawable(Context, int)
  • 可获得的任何其他可绘制对象

此方法内部调用 AppCompatDrawableManager.get().getDrawable(Context, int),它不是 public API 的一部分。从消费者的角度来看,这两种方法在功能上是相同的。

VectorDrawableCompat.create(...) 只会膨胀矢量绘图(仅当构建脚本启用支持矢量绘图时;进一步阅读)。

But this does not produce a drawable on my test device (Android 4.3)

VectorDrawableCompat.create(...) 将 return null 出错。如果引用的可绘制对象不是矢量可绘制对象,则可能会发生这种情况,如果您没有正确配置构建插件并且为低于 API 21.

的平台生成了 PNG,则可能会发生这种情况

通过更改 app 模块 build.gradle:

激活低于 API 21 的矢量绘图支持
// Gradle Plugin 2.0+  
android {  
  defaultConfig {  
    vectorDrawables.useSupportLibrary = true  
  }  
}  

有关详细信息,请参阅 Android Support Library 23.2 博客 post。

I am using support lib version 24.2.1, and have enabled support vectors with AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

此方法不“启用支持向量”。首先,如上所述,您需要在 build.gradle 中启用支持矢量绘图。

之后,此方法基本上启用了可绘制容器内的支持矢量可绘制对象,例如 LayerDrawableStateListDrawable

请参阅 AppCompat — Age of the vectors 了解如何滥用它的更多信息。