我正在开发一个Android项目,我选择了<vector>
来显示图标,因为它具有适应性和动态性,但是,我只能在运行Android的设备上运行此应用,该设备具有API 21或更高版本。我的问题是如何在较低的Android版本(即API 14或其类型)上使用<vector>
。谢谢!
<!-- drawable/ic_android_debug_bridge.xmlxml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="48dp"
android:width="48dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/primaryColorDark"
android:pathData="M15,9A1,1 0 0,1 14,8A1,1 0 0,1 15,7A1,1 0 0,1 16,8A1,1 `0 0,1 15,9M9,9A1,1 0 0,1 8,8A1,1 0 0,1 9,7A1,1 0 0,1 10,8A1,1 0 0,1 9,9M16.12,4.37L18.22,2.27L17.4,1.44L15.09,3.75C14.16,3.28 13.11,3 12,3C10.88,3 9.84,3.28 8.91,3.75L6.6,1.44L5.78,2.27L7.88,4.37C6.14,5.64 5,7.68 5,10V11H19V10C19,7.68 17.86,5.64 16.12,4.37M5,16C5,19.86 8.13,23 12,23A7,7 0 0,0 19,16V12H5V16Z" /></vector>`
答案 0 :(得分:74)
使用支持库23.2,Vector Drawables的真正支持一直提供给API v7。 建议通过添加
来禁用在构建期间呈现PNG的先前版本的支持// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
到build.gradle
文件。
实施相当简单。 Drawables上有一个新的 srcCompat 属性:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" /> <= this is new
TextView的drawableLeft
属性。
但是,我仍然建议使用Iconics library,AndroidSVG或其他字体图标或SVG解决方案来获得完整的SVG-standand支持。
答案 1 :(得分:69)
通过支持库支持Lollipop前的VectorDrawable,但使用它们的方式取决于您拥有的支持库的版本。它可能在所有情况下都不起作用。
我已this diagram提供帮助(对支持库23.4.0有效 - 至少 - 25.1.0)。
答案 2 :(得分:37)
我找到了解决方案!对于那些使用TextView和其他“android”命名空间属性搜索解决方案的人。 首先,这是必要的:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
在应用程序类中定义:
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
现在您可以使用app:srcCompat="@drawable/ic_add"
,但如果您尝试使用android:background=
或android:drawableLeft=
,则会因“错误充气”异常而导致应用崩溃。
我们可以为此向量创建包装的可绘制ic_add_wrapped.xml
:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_add"/>
</layer-list>
现在它适用于任何属性,如drawableLeft或background。只需设置android:drawableLeft="@drawable/ic_add_wrapped.xml"
即可。
警告!这是一个解决方案。因此,您自己承担风险。
答案 3 :(得分:23)
Vector Drawables现在向后兼容,只需将您的gradle版本升级到1.4.0-beta3或更高版本,然后升级您的IDE:
我们也很高兴为您的矢量提供向后兼容性 Android Studio 1.4中的资产。一旦你有了vectorDrawable图像 你的res / drawable,Gradle插件会自动生成 构建时间内API级别20及以下的栅格PNG图像。这个 意味着您只需要更新和维护您的矢量资产 应用程序项目和Android Studio可以处理图像转换 过程
http://android-developers.blogspot.com.uy/2015/09/android-studio-14.html
答案 4 :(得分:20)
检查您的build.gradle
(项目),如果使用版本2.0+,请在build.gradle
(app)中添加以下代码
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
和:如果在build.gradle
(app)
// Gradle Plugin 1.5
android {
defaultConfig {
generatedDensities = []
}
// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
这是使用矢量图标的示例代码:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add"
tools:ignore="MissingPrefix" />
或
<ImageButton
android:layout_width="wrap_content"
android:background="@android:color/transparent"
app:srcCompat="@drawable/camera"
tools:ignore="MissingPrefix"
android:layout_height="wrap_content"/>
在TextView&#39; drawableLeft
属性的情况下也支持Vector Drawable。但它对我来说有效,但我仍然不知道它如何适用于低api。
另请注意,如果您希望在API 21下方兼容:
android:background
函数中使用View.setBackgroundResource()
属性。您需要使用View.setBackground()
。答案 5 :(得分:15)
当你需要以编程方式添加VectorDrawable(从SVG创建)时,你可以这样做:
icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)
答案 6 :(得分:4)
我遇到的问题是我的矢量图像会显示但是会完全变黑,这是因为您无法在矢量xml文件中引用颜色资源。
因此,您必须使用实际颜色,而不是@color/primaryColorDark
。 #212121
答案 7 :(得分:2)
只是为了让@ 2Dee的答案完整:
VectorDrawable不能在API 20及更低版本上使用。官方方法生成png,然后变成BitmapDrawables,这打破了矢量图形的想法。
我个人更喜欢svg而不是xml向量:
要使用矢量图形,您可以尝试https://github.com/BigBadaboom/androidsvg。它是一个svg阅读器和svg兼容的ImageView。
答案 8 :(得分:2)
如果您使用的是Android Studio 3.0.0,则可以设置
android.enableAapt2=false
gradle.properties中的
https://www.reddit.com/r/androiddev/comments/6mj8di/android_studio_30_canary_6_released/
答案 9 :(得分:2)
为兼容较低版本,
在gradle中添加以下内容,
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
在您的应用程序类的onCreate()中添加以下代码,
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
在imageView的xml中,
<ImageView
android:id="@+id/imageViewMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/transparent"
app:srcCompat="@drawable/ic_success"/>
如果您要以编程方式更改图片来源,
imageView.setImageResource(R.drawable.ic_launcher);
答案 10 :(得分:0)
在gradle默认中设置 vectorDrawables.useSupportLibrary = true ,并在创建时在活动中设置 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 后
为避免在Textview中使用 android:drawableleft 崩溃,请以编程方式将drawble设置为textview的左侧 例如:
textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);
答案 11 :(得分:0)
我也发现了同样的问题。我做到了:
vectorDrawables.useSupportLibrary = true
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie,0,0,0);
很好。但是之后,我得到一个错误,即找不到资源。
因此,我发现最好根据SDK版本添加矢量图像。
最后,这个解决方案对我来说是好的:-
HttpServletRequest request = ((ServletRequestAttributes)
RequestContextHolder.currentRequestAttributes()).getRequest();
request.getHeader("mycustom");