Android 4.4(API 级别 20)及更低版本不支持矢量图
如果在低版本上使用有两个选择:
- 生成png(默认)
- 使用支持库
生成PNG
如果最低 API 级别为 Android 4.4(API 级别 20)及更低版本,且您未启用支持库技术,则 Vector Asset Studio 将生成 PNG 文件。在 Project 窗口的 Project Files 视图中,您可以在 app/build/generated/res/pngs/debug/ 文件夹中查看生成的 PNG 和 XML 文件。
支持库
此技术需要 Android 支持库 23.2 或更高版本、适用于 Gradle 的 Android 插件 2.0 或更高版本,且仅使用矢量图。利用支持库中的 VectorDrawableCompat 类,可实现在 Android 2.1(API 级别 7)及更高版本中支持 VectorDrawable
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.2.0'
}
您还必须使用与支持库兼容的编码技术,例如对矢量图使用 app:srcCompat 属性,而不是 android:src 属性。如需了解详细信息,请参阅 Android 支持库 23.2
As of Android Support Library 23.3.0, support vector drawables can only be loaded via app:srcCompat or setImageResource()..
关于setCompatVectorFromResourcesEnabled
在网上有的地方看到在继承AppCompatActivity中添加如下代码:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
setCompatVectorFromResourcesEnabled
added in [version 24.1.0]
(https://developer.android.com/topic/libraries/support-library/revisions.html)Sets whether vector drawables on older platforms (< API 21) can be used within DrawableContainer resources.
When enabled, AppCompat can intercept some drawable inflation from the framework, which enables implicit inflation of vector drawables within DrawableContainer resources. You can then use those drawables in places such as
android:src
on ImageView, orandroid:drawableLeft
on TextView.
Example usage:
<selector xmlns:android="...">
<item android:state_checked="true"
android:drawable="@drawable/vector_checked_icon" />
<item android:drawable="@drawable/vector_icon" />
</selector>
<TextView
...
android:drawableLeft="@drawable/vector_state_list_icon" />
This feature defaults to disabled, since enabling it can cause issues with memory usage, and problems updating Configuration instances. If you update the configuration manually, then you probably do not want to enable this. You have been warned.
Even with this disabled, you can still use vector resources through setImageResource(int) and its
app:srcCompat
attribute. They can also be used in anything which AppCompat inflates for you, such as menu resources.Please note: this only takes effect in Activities created after this call.
AppCompatDelegate.setCompatVectorFromResourcesEnabled该方法就是在xml中我们可以更方便的时候vector drawable,比如在imageview中直接使用src,在textview中使用drawableleft(低版本中textview的drawable使用svg会有问题),但是会有问题,所以还是不要使用。上面android-support-library引用中已经说明,使用srcCompat或者setImageResource就可以了
textview设置compoundDrawable问题
5.0以下某些机型可能会崩溃的,原因是AppCompatTextView是没有对CompoundDrawable进行适配的,所以我们要判断系统版本如果小于5.0,就用ContextCompat.getDrawable获取到Drawable实例,再setCompoundDrawablesWithIntrinsicBounds。
GitHub - woxingxiao/VectorCompatTextView
总结
- 使用支持库
-
ImageView
xml中使用app:srcCompat
-
ImageView
代码中使用setImageResource
-
textview
中xml的compoundDrawable
问题(参考上面github) - vector drawable通过
AppCompatResource
获得(即要通过该类去获得svg的drawable),不然会报Resource$NotFoundException
- svg最好只使用在icon中,使用在background或者selector中还有一些问题需要考虑(比方说xml中不支持background使用svg)
在代码中设置ImageView
的background
,设置TextView
的compundDrawable
imageView2.setBackgroundDrawable(AppCompatResources
.getDrawable(this,R.drawable.ic_icon_loading/));
textView2.setCompoundDrawablesWithIntrinsicBounds(null,null,AppCompatResources.getDrawable(this,R.drawable.ic_icon_loading),null);
Tint使用
- xml中直接使用
- 代码中使用
Drawable drawable = AppCompatResources.getDrawable(this, R.drawable.ic_icon_loading);
//Drawable drawable = imageView3.getDrawable();
if (drawable != null) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
drawable = DrawableCompat.wrap(drawable).mutate();
}
DrawableCompat.setTint(drawable, ContextCompat.getColor(this, R.color.colorAccent));
imageView3.setImageDrawable(drawable);
}