Je ne parviens pas à appliquer un fond dégradé à LinearLayout.
Cela devrait être relativement simple d'après ce que j'ai lu, mais cela ne semble tout simplement pas fonctionner. À titre de référence, je développe actuellement la version 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>
Si je change @ drawable/header_bg en une couleur - par exemple. # FF0000 cela fonctionne parfaitement bien. Est-ce que je manque quelque chose d'évident ici?
Ok j'ai réussi à résoudre cela en utilisant un sélecteur. Voir le code ci-dessous:
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>
Espérons que cela aide quelqu'un qui a le même problème.
Il est également possible d'avoir la troisième couleur (centre). Et différentes sortes de formes.
Par exemple, dans 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>
Cela vous donne noir - gris - noir (de gauche à droite) ce qui est mon atm préféré de fond sombre.
N'oubliez pas d'ajouter gradient.xml comme arrière-plan dans votre mise en page XML:
Android:background="@drawable/gradient"
Il est également possible de faire pivoter, avec:
angle = "0"
vous donne une ligne verticale
et avec
angle = "90"
vous donne une ligne horizontale
Les angles possibles sont:
0, 90, 180, 270.
De plus, il y a peu de formes différentes:
Android: forme = "rectangle"
Forme arrondie:
Android: forme = "ovale"
et probablement un peu plus.
J'espère que ça aide, à la vôtre!
Dans un fichier XML dessinable:
<?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>
Dans votre fichier de mise en page: 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>
Essayez de supprimer Android: gradientRadius = "90". En voici un qui fonctionne pour moi:
<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>
Mon problème était que l'extension .xml n'a pas été ajoutée au nom de fichier du fichier XML nouvellement créé. L'ajout de l'extension .xml a résolu mon problème.
Je ne sais pas si cela aidera quelqu'un, mais mon problème était que j'essayais de définir le dégradé sur la propriété "src" d'un ImageView comme suit:
<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"/>
Je ne suis pas sûr à 100% pourquoi cela n'a pas fonctionné, mais maintenant je l'ai modifié et mis la propriété drawable dans la propriété "background" du parent de ImageView, qui est un RelativeLayout dans mon cas, comme ceci: (cela a fonctionné avec succès)
<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">
Je voudrais vérifier votre canal alpha sur vos couleurs de dégradé. Pour moi, lorsque je testais mon code, le canal alpha était mal défini pour les couleurs et cela ne fonctionnait pas pour moi. Une fois le canal alpha défini, tout a fonctionné!
Vous pouvez utiliser une vue personnalisée pour le faire. Avec cette solution, les formes en dégradé de toutes les couleurs de vos projets sont finies:
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)
}
}
Je crée également un projet open source GradientView avec cette vue personnalisée:
https://github.com/lopspower/GradientView
implementation 'com.mikhaellopez:gradientview:1.1.0'