Android, как изменить <элемент> ширину и высоту

Я делаю<layer-list> для рисования.

У меня есть фоновое изображение, и я хочу, чтобы второй слой был меньше, но кажется, что не имеет значения, что я пишу внутри моегоandroid:layer_width а такжеandroid:layer_height.

Размер второго слоя все тот же.

Вот мой xml:

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

    <item
        android:drawable="@drawable/picuser" 
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <item
        android:drawable="@drawable/ic_launcher" 
        android:layout_width="10dp"
        android:layout_height="10dp" />
</layer-list>

Ответы на вопрос(6)

<item>, слишком. Спасибо @Entreco за публикацию демонстрации этого.
android:width а такжеandroid:height дляDrawables похожи наandroid:layout_width а такжеandroid:layout_height дляViews, в отличие от них не может быть установлено ниmatch_parent ниwrap_content, но вы можете добиться того же поведенияmatch_parent установив атрибутandroid:gravity либоleft|right илиstart|end (для соответствия ширине родителя) илиtop|bottom (для соответствия росту родителей).

К сожалению, эти атрибуты доступны только послеAPI 23.

Однако, учитывая вышеописанный метод, который я предложил вместоmatch_parent и этоandroid:width а такжеandroid:height атрибуты доступны для<size>лемент @ (который должен быть помещен в<shape>) без каких-либо ограничений API, вы можете использовать простой обходной путь:

<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item>

        <shape
            android:shape="rectangle">

            <size
                android:width="152dp"
                android:height="152dp"/>

            <solid
                android:color="#00FFFFFF"/>
        </shape>
    </item>

    <item>

        <bitmap
            android:gravity="left|right|top|bottom"
            android:src="@mipmap/ic_launcher"/>
    </item>
</layer-list>

Вышеупомянутое решение использует размер<item> (с прозрачным<shape>) и нестандартный (с<bitmap>) который имеетandroid:gravity установлен вleft|top|right|bottom для сопоставления размеров обоих родителей. Итак, реальный размер<bitmap> будет определяться уникальным размером<item> у того же родителя.

РЕДАКТИРОВАТЬ

Спасибо @Emil S, который заметил, что вышеуказанное решение не будет работать в качестве фона окна. Он работает только как фон или передний план любого вида. Я не знаю конкретной причины такого странного поведения, но могу предположить, что в то время, когда система создает окно с фоном, указанным наandroid:windowBackground атрибут, макет не выполняется, так как процесс еще не запущен. Так что Android, в конечном итоге, растеризует растягиваемое изображение до размера экрана и растягивает его, чтобы заполнить все окно, я думаю. Это объясняет, как это могло произойти.

РЕДАКТИРОВАТЬ

@ Жоао Карлос указал, что мое решение не будет работать (потому что оно вызовет циклическое наследование) при использовании адаптивного значка (иконки, сделанные фоном и передним планом, которые поддерживают векторные рисунки). Однако его точка зрения бессмысленна, потому что для адаптивных иконок требуетсяAPI 26: можно использовать напрямуюandroid:width а такжеandroid:height на заставке или что-то в этом роде (они просто требуютAPI 23).
Итак, чтобы заставить что-либо работать в любой версии Android, вам нужно будет разграничить два drawables, первый дляAPI <23, используя решение, которое я разместил, и последнее дляAPI> = 23, используя два атрибута, как я сказал в начале моего поста.

На уровне API 23 и выше вы можете установить ширину и высоту элемента

<item
    android:drawable="@drawable/splash_logo"
    android:height="100dp"
    android:width="100dp"/>

НОТА Используйтеandroid:width а такжеandroid:height вместо тогоandroid:layout_width а такжеandroid:layout_height

Надеюсь, это направит тебя в правильном направлении:

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

    <item android:drawable="@drawable/picuser"/>

    <item>

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

Как вы видетеВо, <item> не имеетlayout_width/layout_height атрибуты.

но не смог найти надежного способа центрировать логотип в макете XML. Наконец, я нашел следующий обходной путь:

mToolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            ImageView imageView = (ImageView)mToolbar.findViewById(R.id.logo);
            if (mToolbar == null)
                return;
            int toolbarWidth = mToolbar.getWidth();
            int imageWidth = imageView.getWidth();
            imageView.setX((toolbarWidth - imageWidth) / 2);
        }
    });

Layout_toolbar.xml:

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    style="@style/Toolbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/toolbar_height"                                                                   
    android:background="@drawable/toolbar_background"
    android:focusable="false"                                
    app:titleTextAppearance="@style/AppTheme.Toolbar.Title">

    <ImageView
        android:id="@+id/logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/toolbar_logo" />
</android.support.v7.widget.Toolbar>


Вы можете использовать отступы, чтобы сделать второй рисунок меньше.

<item android:drawable="@drawable/circyle" />

<item
    android:drawable="@drawable/plus" 
    android:top="10dp"
    android:bottom="10dp"
    android:right="10dp"
    android:left="10dp" />

Попробуй это

<?xml version="1.0" encoding="utf-8"?>
<!-- The android:opacity=”opaque” line is critical in preventing a flash 
of black as your theme transitions. -->
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">

    <!-- The background color, preferably the same as your normal theme -->
    <item android:drawable="@android:color/white" />

    <item
        android:height="100dp"
        android:width="100dp"
        android:gravity="center">

        <bitmap
            android:src="@drawable/ic_launcher_bc_512"/>
    </item>
</layer-list>

ВАШ ОТВЕТ НА ВОПРОС