Изменение формы векторного актива во время выполнения (например, вырезать часть сверху) для отображения прогресса пользователя в Android. Это возможно? - PullRequest
1 голос
/ 11 апреля 2020

Я бы хотел показать прогресс игрока, используя векторный актив в Android. Я хотел бы использовать только один векторный файл активов, потому что «процент выполнения» может отличаться. Например, он может сильно отличаться, например, 8%, 51% и т. Д. c.

Когда у меня был простой цветной фон, я использовал дополнительный слой * angular такого же цвета, что и фон скрыть часть SVG соответственно прогрессу, но сейчас я не могу - начал использовать красивые картинки в качестве фона.

Пожалуйста, смотрите картинки ниже, чтобы понять, чего я пытаюсь достичь:

20% progress - SVG cut by 80%

40% progress - SVG cut by 60%

10% progress - original .SVG

A читали это https://medium.com/androiddevelopers/understanding-androids-vector-image-format-vectordrawable-ab09e41d5c68, искали в Google, в stackOverflow - но до сих пор нет ответа .

Ребята, у вас есть идеи? Заранее спасибо ..

Ответы [ 2 ]

1 голос
/ 11 апреля 2020
/** @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
    }
}

Вы можете создать свой собственный вид изображения и добавить этот метод туда, или немного изменить его и добавить его внутри своего фрагмента / действия

0 голосов
/ 11 апреля 2020

Благодаря Бачо Куртанидзе советую, я уже решил свою проблему. Я объясню здесь, что я сделал для будущих посетителей:

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. Назначен новый' drawable 'для ImageView, который содержал' brin_fill.xml; актив до:

...

<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));
...