在运行时修改矢量资产的形状(比如从顶部切下一部分)以在 Android 中显示用户进度。那可能吗?

Modifying shape of vector asset at runtime (like cut some part from top) to display user progress in Android. Is that possible?

我想使用Android中的矢量资源显示玩家进度。我只想使用一个矢量资产文件,因为 'progress percentage' 可能会有所不同。例如,它可以非常不同,如 8%、51% 等。

我有纯色背景时,我使用了与背景颜色相同的附加矩形层来根据进度隐藏部分 SVG,但现在我不能 - 开始使用漂亮的图像作为背景。

请查看下面的图片以了解我尝试实现的目标:

A 正在阅读此 https://medium.com/androiddevelopers/understanding-androids-vector-image-format-vectordrawable-ab09e41d5c68,在 Google 上搜索,在 Whosebug 上搜索 - 但仍然没有答案。

小伙伴们,你们有什么想法吗? 提前致谢..

/** @IntRange(from=0,to=10000)
 *  0 means hidden 10000 means totally visible*/
fun clipDrawable(level: Int) {
    if (drawable is ClipDrawable){
        drawable.level = level
    } else {
        val clippedDrawable = ClipDrawable(drawable, Gravity.TOP, HORIZONTAL)
        setImageDrawable(clippedDrawable)
        (drawable as? ClipDrawable)?.level = level
    }
}

您可以创建自定义图像视图并在其中添加此方法,或者稍微修改一下并将其添加到您的 fragment/activity

感谢 Bacho Kurtanidze 的建议,我已经解决了我的问题。我将在这里为未来的访客解释我所做的事情:

1.仔细阅读ClipDrawable官方文档:https://developer.android.com/reference/android/graphics/drawable/ClipDrawable

和本教程: https://programmer.group/how-to-use-clipdrawable-to-realize-imageview-picture-switching-animation.html 实现 ClipDrawable 所需的一切都有,尽管文本不是 100% 清晰。

2. 将我的矢量资产放入单独的 'clip_brain_fill.xml' 中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="bottom"
    android:clipOrientation="vertical"
    android:drawable="@drawable/brain_fill"/>

3. 将新的 'clip drawable' 分配给持有 'brin_fill.xml 的 ImageView;之前的资产:

...

<ImageView
        android:id="@+id/brain_fill_iv"
        android:layout_width="@dimen/brain_width"
        android:layout_height="@dimen/brain_height"
        app:srcCompat="@drawable/clip_brain_fill" />

...

4. 现在可以从 java 代码中设置裁剪级别,如下所示:

ImageView brainFillIV = findViewById(R.id.brain_fill_iv);

ClipDrawable clipBrainFill = (ClipDrawable) brainFillIV.getDrawable();

clipBrainFill.setLevel((int) (percents * 100));