Android LinearLayout Gradient Background
У меня возникли проблемы с применением фона градиента для LinearLayout.
Это должно быть относительно просто из того, что я прочитал, но он просто не работает. Для справки я разрабатываю 2.1-update1.
header_bg.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="90"
android:startColor="#FFFF0000"
android:endColor="#FF00FF00"
android:type="linear"/>
</shape>
main_header.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal"
android:background="@drawable/header_bg">
</LinearLayout>
Если я изменяю @drawable/header_bg на цвет - например, # FF0000 работает отлично. Я пропустил что-то очевидное здесь?
Ответы
Ответ 1
Хорошо, мне удалось решить это с помощью селектора. См. Следующий код:
main_header.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal"
android:background="@drawable/main_header_selector">
</LinearLayout>
main_header_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient
android:angle="90"
android:startColor="#FFFF0000"
android:endColor="#FF00FF00"
android:type="linear" />
</shape>
</item>
</selector>
Надеюсь, это поможет кому-то, у кого такая же проблема.
Ответ 2
Также возможно иметь третий цвет (в центре). И разные виды фигур.
Например, в drawable/gradient.xml:
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#000000"
android:centerColor="#5b5b5b"
android:endColor="#000000"
android:angle="0" />
</shape>
Это дает вам черный - серый - черный (слева направо), который является моим любимым темным фоном.
Не забудьте добавить gradient.xml в качестве фона в вашем макете xml:
android:background="@drawable/gradient"
Можно также вращать, используя:
угол = "0"
дает вертикальную линию
и
angle = "90"
дает горизонтальную линию
Возможные углы:
0, 90, 180, 270.
Также существует несколько различных типов фигур:
Android: форма = "прямоугольник"
Закругленная форма:
Android: форма = "овальный"
и, вероятно, еще несколько.
Надеюсь, это поможет, ура!
Ответ 3
В XML-чертеже:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient android:angle="90"
android:endColor="#9b0493"
android:startColor="#38068f"
android:type="linear" />
</shape>
</item>
</selector>
В вашем файле макета: android: background = "@drawable/gradient_background"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient_background"
android:orientation="vertical"
android:padding="20dp">
.....
</LinearLayout>
![введите описание изображения здесь]()
Ответ 4
Попробуйте удалить андроид: gradientRadius = "90". Вот тот, который работает для меня:
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<gradient
android:startColor="@color/purple"
android:endColor="@color/pink"
android:angle="270" />
</shape>
Ответ 5
Моя проблема заключалась в том, что расширение .xml не было добавлено к имени файла только что созданного XML файла. Добавление расширения .xml устранило мою проблему.
Ответ 6
Я не знаю, поможет ли это кому-либо, но проблема была в том, что я пытался установить градиент в свойство "src" ImageView следующим образом:
<ImageView
android:id="@+id/imgToast"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:src="@drawable/toast_bg"
android:adjustViewBounds="true"
android:scaleType="fitXY"/>
Не на 100% уверен, почему это не сработало, но теперь я изменил его и поместил в свойство "background" родителя ImageView, который является RelativeLayout в моем случае, например: (это сработало успешно)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/custom_toast_layout_id"
android:layout_height="match_parent"
android:background="@drawable/toast_bg">
Ответ 7
Вы можете использовать пользовательский вид для этого. С помощью этого решения он завершил градиентные формы всех цветов в ваших проектах:
class GradientView(context: Context, attrs: AttributeSet) : View(context, attrs) {
// Properties
private val paint: Paint = Paint()
private val rect = Rect()
//region Attributes
var start: Int = Color.WHITE
var end: Int = Color.WHITE
//endregion
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
// Update Size
val usableWidth = width - (paddingLeft + paddingRight)
val usableHeight = height - (paddingTop + paddingBottom)
rect.right = usableWidth
rect.bottom = usableHeight
// Update Color
paint.shader = LinearGradient(0f, 0f, width.toFloat(), 0f,
start, end, Shader.TileMode.CLAMP)
// ReDraw
invalidate()
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawRect(rect, paint)
}
}
Я также создаю проект с открытым исходным кодом GradientView с помощью этого настраиваемого представления:
https://github.com/lopspower/GradientView
implementation 'com.mikhaellopez:gradientview:1.1.0'
Ответ 8
Я бы посмотрел ваш альфа-канал на цвета градиента. Для меня, когда я тестировал свой код, у меня был неправильный альфа-канал на цветах, и это не сработало для меня. Как только я получил альфа-канал, все это сработало!