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

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>
4b9b3361

Ответ 1

Я надеюсь, что это направит вас в правильном направлении:

<?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.

Ответ 2

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

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

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

Ответ 3

В отличие от того, кто сказал, есть также атрибуты ширины и высоты для <item>. Спасибо @Entreco за публикацию демонстрации этого.
android:width и android:height для Drawable аналогичны android:layout_width и android:layout_height для View с, в отличие от того, что они не могут быть установлены ни на 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> в том же родительском элементе.

EDIT:

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

EDIT:

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

Ответ 4

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

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

ПРИМЕЧАНИЕ. Используйте android:width и android:height вместо android:layout_width и android:layout_height

Ответ 5

Я много пробовал, но не смог найти надежного способа центрировать логотип в макете 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>

Ответ 6

Попробуй это:

<?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>