android - Android API 16 及更高版本上图层列表中的矢量可绘制对象

标签 android drawable android-vectordrawable

我在 Android 的旧 API 版本上绘制矢量时遇到了一些问题。我需要在运行时更改可绘制对象,每次 Activity 启动时都应加载相应的 svg 文件。

这是我的图层列表:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item >
    <shape android:shape="oval">
        <size android:height="50dp" android:width="50dp"/>
        <!-- fill color -->
        <solid android:color="@color/white" />
    </shape>
</item>
<item
    android:id="@+id/avatar"
    android:drawable="@drawable/dog" //I need to change this at run time
    android:bottom="10dp"
    android:left="10dp"
    android:right="10dp"
    android:top="10dp"/>

在我的 Activity 中,我正在使用

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

到目前为止,我正在使用可绘制图层来选择 xml 文件并更改 svg,但我遇到了兼容性问题,因为 layerDrawable.setDrawble() 仅在 API 级别 >= 23

 layerDrawable = (LayerDrawable) ContextCompat.getDrawable(this, R.drawable.seekbar_thumb);
 Drawable avatar = (Drawable) ContextCompat.getDrawable(this, getUserAvatarId());
 layerDrawable.setDrawable(0, avatar);

最佳答案

解决这个问题很简单。这个概念是我想在 Activity 的 onCreate() 状态下更改搜索栏的拇指。我的搜索栏的拇指是我发布的可绘制文件。基本上,它会加载一个周围带有白色描边的 SVG 文件,根据用户的不同,这个 SVG 应该是可变的。

对于 Android API >= 16,解决方案如下:

layerDrawable = (LayerDrawable) ContextCompat.getDrawable(this, R.drawable.seekbar_thumb);
Drawable avatar = VectorDrawableCompat.create(getResources(), getUserAvatarId(), null);
layerDrawable.mutate(); //not share its state with other drawables
layerDrawable.setDrawableByLayerId(R.id.avatar, avatar);
layerDrawable.invalidateSelf(); //inform the layer drawable when it needs to redraw
seekBar.setThumb(layerDrawable);

函数 setDrawableById(int, drawable) 是 bool 类型,如果图层的可绘制对象发生变化则返回 true,否则返回 false!在这种情况下,您需要用新的可绘制文件替换 View seekBar.setThumb(layerDrawable);

关于android - Android API 16 及更高版本上图层列表中的矢量可绘制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48462364/

相关文章:

java - SQL数据库错误: Table has no column name

android - XML 中的垂直条纹背景?

Android:是否可以制作一个带有可绘制对象的列表,1 在上面,其他在下面?

android - 如何测试androidx.fragment.app.Fragment.onCreateOptionsMenu()?

java - 无法检索列表 firebase

java - 将 Action 传递给按钮

java - Google Play 保存的游戏 Android : result of Games. Snapshots.open()/resolveConflict() 经常有状态 16

java - Android 中存储的可绘制对象发生变化

android - 有没有办法改变菜单项图标和文本的颜色?

android - 如何在 Vector Drawable 中对图标的特定部分进行动画处理?