我在 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/