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>
Ответы
Ответ 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>