Подтвердить что ты не робот

Как центрировать вектор, который можно рисовать в списке слоев без масштабирования

Я пытаюсь использовать VectorDrawable в LayerList без масштабирования вектора. Например:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
    <item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

Выбираемый идентификатор ic_check_white_48dp, определяемый как:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="48dp"
        android:height="48dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

Желаемый эффект заключается в том, что значок проверки будет центрироваться в растягиваемом слое без масштабирования. Проблема в том, что приведенный выше список слоев заставляет значок проверки масштабироваться в соответствии с размером слоя.

Я могу произвести желаемый эффект, если я заменил вектор, который можно рисовать с помощью PNG для каждой плотности, и изменит список слоев как таковой:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/ic_check_white_48dp"/>
    </item>
</layer-list>

Есть ли способ сделать это с помощью VectorDrawable?

4b9b3361

Ответ 1

Борясь с той же проблемой. Единственный способ, который я нашел, чтобы исправить это и избежать масштабируемого масштабирования, заключался в том, чтобы установить размер рисунка и использовать гравитацию, чтобы выровнять его:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
     <item
        android:gravity="center"
        android:width="48dp"
        android:height="48dp"
        android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

Надеюсь, что это поможет!

Ответ 2

Я столкнулся с той же проблемой, пытаясь центрировать векторы drawables в многоуровневом списке.

У меня есть обходное решение, это не совсем то же самое, но оно работает, вам нужно установить размер для всего выделенного и добавить дополнение к элементу вектора:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <size android:height="120dp" android:width="120dp"/>
            <solid android:color="@color/grid_item_activated"/>
        </shape>
    </item>
    <item android:top="24dp"
          android:bottom="24dp"
          android:left="24dp"
          android:right="24dp"
          android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

Размер вышеприведенной формы задает размер всего выделенного 120dp в этом примере, добавление второго элемента, 24dp в этом примере, центрирует векторное изображение.

Не то же самое, что использовать gravity="center", но его рабочий способ использования векторов в API 21 и 22.