Всякий раз, когда я назначаю фон для представления, которое выложено с помощью wrap_content, если фоновое изображение больше, чем представление, представление растягивается так, что оно может удерживать весь фон. Почему это так и как предотвратить это? Это происходит даже в том случае, если изображение имеет 9-патч и отмечены растяжимые области - почему изображение не уменьшено до размера представления?
Предотвращение растягивания фонового изображения
Ответ 1
Вы можете использовать RelativeLayout и создать в нем два элемента. ImageView для фона и другое представление для вашего контента. Используйте android:layout_alignBottom
для ImageView и установите значение для идентификатора вашего содержимого. Также установите для параметра scaleType ImageView значениеXY.
<RelativeLayout android:id="@+id/relativeLayout1"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_width="fill_parent">
<ImageView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:src="@drawable/chronometer_bg"
android:id="@+id/imageView_chronometerBackground"
android:layout_alignBottom="@id/chronometer" />
<Chronometer android:text="Chronometer"
android:id="@+id/chronometer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textSize="32sp"
android:gravity="center" />
</RelativeLayout>
Ответ 2
Либо переопределить методы getSuggestedMinimumWidth и getSuggestedMinimumHeight вашего макета или методов getMinimumWidth и getMinimumHeight вашего фона, пригодного для достижения этого.
Ответ 3
Вы можете попробовать установить ширину и высоту примерно как 60dp
вместо wrap_content
и использовать android:scaleType
.
Ответ 4
Вместо использования фона вы можете использовать FrameLayout с ImageView в качестве первого элемента. Затем используйте android: scaleType = "center", чтобы изображение не масштабировалось. Он всегда будет оригинальным размером и центрирован. Затем вы можете поместить все виды, которые вам нравятся, поверх него в FrameLayout.
Ответ 5
Это может быть сумасшедшая идея, но как насчет создания специального изображения с девятью патчами, например:
- взять исходное изображение
- добавить вокруг него 2-х пиксельную рамку (1 пиксельная рамка для 9-патч-маркировки и 1 пиксельная пустая рамка)
- отметьте пустую границу как растяжимую
Таким образом, вы будете иметь 2 растяжимые области по горизонтали и 2 по вертикали, что является пустой границей. Таким образом, центр изображения (ваше исходное изображение остается немасштабированным)
Btw, это может быть не лучшее решение, но поскольку другие уже перечислили хорошие решения, я подумал, что я тоже добавил это: -)
Ответ 6
Почему так? Поскольку вы устанавливаете ширину на wrap_content
.
Как вы можете предотвратить это:
а. Установите атрибут maxWidth
.
б. Попробуйте поместить ImageView
с помощью wrap_content
внутри макета с фиксированной шириной.
с. (Я часто использую TableLayout, поскольку его атрибуты shrinkColumns и stretchColumns удобны для таких вещей. Возможно, это может сработать и для вас.)
Слишком много, требуется XML.