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 以获得完整的解释:
使用 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>
我想开始在我做的应用程序中使用矢量图标,但不确定如何处理兼容性
我对任何第三方兼容库都不感兴趣,很高兴等待谷歌版本(此处提到 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 以获得完整的解释:
使用 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>