Android 矢量兼容性

Android vector compatibility

我想开始在我做的应用程序中使用矢量图标,但不确定如何处理兼容性

我对任何第三方兼容库都不感兴趣,很高兴等待谷歌版本(此处提到 VectorDrawable - is it available somehow for pre-Lollipop versions of Android?)。

所以基本上现在我很高兴继续拥有每个分辨率的图像以及 > Lollipop 的附加图像。如果设备高于 21,它将使用矢量,否则它将回退到标准 png。

我可以将矢量放在 drawable-v21 文件夹中,但 drawable-[dpi] 文件夹优先于版本,这意味着不使用矢量。

我希望使用矢量,以便在兼容可用时我可以简单地删除所有 png,并且知道矢量会正常,因为我已经能够在设备上测试它们 运行棒棒糖。

编辑: 这是 Android studio 1.4 发布之前的临时修复。不再需要这个了。请参阅 Ka Developer 的回答

找到了一个虽然不出色但确实有效的解决方案。

您需要为每个 dpi 文件夹创建一个 lollypop drawables 文件夹,并向每个文件夹添加相同的矢量。

例如创建文件夹

drawable-hdpi-v21
drawable-xhdpi-v21
drawable-xxhdpi-v21
drawable-xxxhdpi-v21

从 Android 5.0(API 级别 21)开始,您可以在您的应用中使用矢量可绘制对象。您可以使用名为 Vector Asset Studio 的新 Android Studio 工具。它自动处理旧版本的 PNG 制作。请参阅下面的 link 以获得完整的解释:

Vector Asset Studio

使用 Android 支持库 23.2, 现在从 API 级别 7 开始支持 VectorDrawables,从 API 级别 11 开始支持 AnimatedVectorDrawables。

所以现在您可以使用

app:srcCompat

而不是

app:src

使用具有向后兼容性的 VectorDrawable

现已google发布Android Support Library 23.2支持矢量绘图和动画矢量绘图!

 // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

Note:

- Vector images all the way back to API 7 (Android 2.1 Eclair).

- Animated vectors are a bit more limited, going only as far back as API 11

为了向后兼容 Vector Drawables,这里是我用于 API Level pre-20 设备的以下配置。

build.gradle

vectorDrawables.useSupportLibrary = true

dependencies{classpath 'com.android.tools.build:gradle:2.1.2'}

Activity

onCreate > AppCompatDelegate.setCompatVectorFromResourcesEnabled(真);

XML ImageView

app:srcCompat="@drawable/vector"

程序化 ImageView

imageView.setBackgroundResource(R.vector);

vector.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="30dp"
        android:height="20dp"
        android:viewportHeight="20.0"
        android:viewportWidth="30.0">
    <path
        android:fillColor="#4C5F70"
        android:pathData="DATA_HERE"
        android:strokeColor="#00000000"
        android:strokeWidth="1"/>
</vector>

如果你使用 SRC,那么使用这个:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

您不需要在每个 activity 中都添加该行,如果您在应用程序 class 中添加一次,它也会起作用。像这样:

public class App extends Application {

static {

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

记住:您仍然需要在应用级别启用支持库 gradle:

android {

  defaultConfig {

    vectorDrawables.useSupportLibrary = true

  }

}

在 xml 内使用:

<ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:srcCompat="@drawable/ic_add" /> 

当你想使用矢量绘图作为drawableTop, bottom, right , left然后使用LayerDrawable否则它会在低于5.0的设备上崩溃[​​=15=]

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/search"/>
</level-list>