Java 如何在低于21的Android API中使用VectorDrawables?
我正在从事一个Android项目,我选择了Java 如何在低于21的Android API中使用VectorDrawables?,java,android,svg,android-vectordrawable,Java,Android,Svg,Android Vectordrawable,我正在从事一个Android项目,我选择了来显示图标,因为它具有适应性和动态性,然而,我只能在运行Android的设备上运行这个应用程序,这些设备具有API 21或更高版本。我的问题是如何在较低的Android版本上使用,即API 14或类似的版本。谢谢 <!-- drawable/ic_android_debug_bridge.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/andr
来显示图标,因为它具有适应性和动态性,然而,我只能在运行Android的设备上运行这个应用程序,这些设备具有API 21或更高版本。我的问题是如何在较低的Android版本上使用
,即API 14或类似的版本。谢谢
<!-- drawable/ic_android_debug_bridge.xml -->
<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>
Vector Drawable现在向后兼容,只需将gradle版本升级到1.4.0-beta3或更高版本,并升级IDE即可: 我们也很高兴为您的矢量提供向后兼容性 Android Studio 1.4中的资产。一旦你有了一个可矢量绘制的图像 您的res/drawable,Gradle插件将自动生成 构建期间API级别20及以下的光栅PNG图像。这 意味着您只需要更新和维护您的矢量资源 app project和Android Studio可以处理图像转换 过程
为了让@2Dee的答案完整: VectorDrawable不能用于API 20及更低版本。官方方法生成PNG,然后变成BitMapDrawable,这打破了矢量图形的概念 我个人更喜欢svg而不是xml向量:
- 这样的图形可以直接从Illustrator或其他流行软件导出
- svg正确地支持转换、文本、掩码和其他内容
- 所有平台上的真正可缩放矢量图形
- 更小的尺寸和更快的构建
要使用矢量图形,您可以尝试。它是一个svg阅读器和svg兼容的ImageView。支持库23.2提供了对矢量绘图的真正支持,一直到API v7。 建议通过添加
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
转到build.gradle
文件
实现相当简单。只需在Drawables上使用新的srcCompat属性(在应用程序名称空间下!):
/如果使用android studio,则需要使用android支持存储库30+
如果使用Eclipse,则需要android支持库23.2.1+
检查您的build.gradle
(项目),如果使用2.0版+在build.gradle
(应用程序)中添加以下代码
和:如果使用1.5版,请在您的build.gradle
(应用程序)中添加以下内容
下面是使用矢量图标的示例代码:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add"
tools:ignore="MissingPrefix" />
或
Vector Drawables在TextView的drawableLeft
属性等情况下也受支持。但它在api 22+上对我起了作用,我仍然不知道它在低api下如何工作
如果您希望与API 21兼容,请记住:
- 您不能在xml中使用
android:background
属性或View.setBackgroundResource()
函数。您需要使用视图.setBackground()
- 不能在StateListDrawable xml-s或其他xml Drawable中使用svg-s,必须以编程方式生成它们
- 在通知的情况下,不能使用svg-s李>
我找到了解决办法!适用于使用TextView和其他“android”命名空间属性搜索解决方案的用户。
首先,这是必要的:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
在应用程序类中定义:
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
现在您可以使用app:srcCompat=“@drawable/ic_add”
,但如果您尝试使用android:background=
或android:drawablelft=
则会导致应用程序崩溃,出现“错误膨胀”异常
我们可以为此向量创建包装的drawableic\u add\u 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\u add\u wrapped.xml”
。
警告这是一个变通解决方案。因此,使用它是为了您自己的风险。当您需要以编程方式添加VectorDrawable(从SVG创建)时,您可以这样做:
icon = VectorDrawableCompat.create(resources, R.drawable.ic_map_black_24dp, null)
我有一个问题,我的矢量图像会显示出来,但会完全是黑色的,这是由于一个问题,你不能引用矢量xml文件中的颜色资源
因此,您必须使用实际颜色,而不是
@color/primarycolorddark
,例如21212121
通过支持库在棒棒糖前支持VectorDrawable,但是使用它们的方式取决于您拥有的支持库的版本。而且它可能并不适用于所有情况
我提供了帮助(对支持库23.4.0至-至少-25.1.0有效)
如果您使用的是Android Studio 3.0.0,您可以设置
android.enableAapt2=false
在格拉德尔
您可以通过编程使用..将
drawableLeft
设置为您的editText
或textView
像
像这样向左转
editText.setCompoundDrawables( tick_drawable , null, null, null );
对于较低版本兼容
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
<ImageView
android:id="@+id/imageViewMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/transparent"
app:srcCompat="@drawable/ic_success"/>
在gradle默认设置中设置vectorDrawables.useSupportLibrary=true之后,AppCompatDelegate.SetCompatrVectorFromResourcesEnabled(true)创建时活动中的strong> 要避免在Textview中使用android:drawableleft时崩溃,请通过编程将drawble left设置为Textview 例如:
textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);
我也发现了同样的问题。我做到了: vectorDrawables.useSupportLibrary=true
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie,0,0,0) 这很好。但是在那之后,我得到了一个错误,资源找不到。
所以我发现最好根据SDK版本添加一个矢量图像 最后,这个解决方案对我来说很好:-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
textview.setCompoundDrawablesWithIntrinsicBounds(null, null, AppCompatResources.getDrawable(this, R.drawable.movie), null);
} else {
textview.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.movie, 0);
}
- 我希望,它会帮助别人
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
<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);
textview.setCompoundDrawablesWithIntrinsicBounds(R.drawable.movie, 0, 0, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
textview.setCompoundDrawablesWithIntrinsicBounds(null, null, AppCompatResources.getDrawable(this, R.drawable.movie), null);
} else {
textview.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.movie, 0);
}