Aperçu
Dans le développement Android, nous utilisons souvent xml pour écrire des fichiers de mise en page. Cette implémentation est non seulement simple, mais aussi plus expressive. Cependant, les attributs de mise en page fournis par Google sont limités et nous devons utiliser du code ou des contrôles personnalisés pour réaliser certaines fonctions. Existe-t-il un moyen d'améliorer les attributs pour obtenir des fonctions supplémentaires? Par exemple, nous utilisons souvent background pour représenter et définir l'arrière-plan, pouvons-nous utiliser layout_radius pour représenter et définir des coins arrondis?
Exemple d'utilisation
Besoin de référencer les dépendances dans le projet build.gradle
implementation 'com.zhangzheng.superxml:library:1.1.0'
Enregistrez également une ligne de code dans l'application
SuperXml.init(this)
PLUS DE
Description de la capacité
Amélioration des attributs
Filet:
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="20dp"
android:background="#FF0000"
app:layout_radius="40dp" />
La description
app: layout_radius prend en charge la définition de l'arrière-plan du contrôle sur des coins arrondis et l'arrière-plan prend en charge les arrière-plans ou les images de couleur unie. De plus, si vous souhaitez définir le src d'ImageView sur des coins arrondis, vous devez utiliser app: layout_src_radius, par exemple
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:src="@mipmap/order_ic_shipper_default" app:layout_src_radius="10dp" />
Attribut composé
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="asdasdasdasd"
app:layout_textColor_pressedFalse="#00FF00"
app:layout_textColor_pressedTrue="#FF0000" />
La description
Dans des circonstances normales, nous voulons indiquer que la couleur de la police est différente entre le clic et l'état normal, ou l'arrière-plan utilisera le sélecteur pour définir un fichier, puis le référencera dans le fichier de mise en page. D'une part, une telle utilisation est très gênante, d'autre part, la lisibilité sera également Diminuer (l'utilisateur doit entrer le fichier de sélection pour analyse avant de connaître l'intention de l'expression de code). Les propriétés de réutilisation couramment utilisées sont encapsulées ici, comme suit:
Les attributs | Type d'attribut | La description |
---|---|---|
|
|
Contexte (est-il disponible) |
|
référence | couleur (ressource ou couleur) | Arrière-plan (si appuyé) |
|
référence | couleur (ressource ou couleur) | Contexte (choisissez ou non) |
|
référence | couleur (ressource ou couleur) | Couleur de police (disponible) |
|
référence | couleur (ressource ou couleur) | Couleur de la police (qu'elle soit enfoncée ou non) |
|
référence | couleur (ressource ou couleur) | Couleur de police (choisissez ou non) |
Cadre
<View
android:id="@+id/view"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="20dp"
android:background="#FF0000"
app:layout_border_color="#0000FF"
app:layout_border_width="1dp"
app:layout_radius="40dp" />
La description
Relativement simple, layout_border_color représente la couleur de la bordure, layout_border_width représente l'épaisseur de la bordure et le rayon est utilisé ensemble pour représenter les coins arrondis de la bordure.
ligne pointillée
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="20dp"
android:background="#FF0000"
app:layout_dash_gap="10dp"
app:layout_dash_height="1dp"
app:layout_dash_width="5dp" />
La description
Il peut être utilisé sur n'importe quelle vue (il est recommandé de le définir dans View), et grap, dash_height et dash_width doivent être définis en même temps. Prend en charge les lignes pointillées horizontales et verticales, ici détectera la largeur et la hauteur de la vue à déterminer. Description de la propriété: dash_grap (espacement des lignes en pointillé), dash_width (largeur d'une seule petite ligne), dash_height (hauteur d'une seule petite ligne)
Afficher le remplacement ou l'amélioration
Cette capacité peut remplacer la vue du fichier de disposition par d'autres contrôles ou l'améliorer.
Vue de défilement
Afin de nous adapter aux téléphones mobiles à petit écran, nous pouvons ajouter une couche de ScrollView à chaque fichier de mise en page, et maintenant le contrôle du conteneur est amélioré.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="130dp"
android:gravity="center"
android:orientation="vertical"
android:scrollbars="none"
app:layout_canScroll="true">
La description
Ajoutez l'attribut app: layout_canScroll = "true" à la vue qui doit être défilée pour lui donner des capacités de défilement. En outre, toutes les propriétés scrollView peuvent être configurées dans le contrôle conteneur.
Remplacement d'attribut
Il existe un scénario de gestion très courant. Il existe plusieurs contrôles dans un élément. La plupart des attributs des contrôles sont identiques (comme la couleur de police et la taille de TextView). En général, nous ajouterons les mêmes attributs à chaque contrôle (redondant ), ou définir un style public (trop gênant). Reportez-vous maintenant à la disposition de html, définissez un style commun dans le contrôle parent et définissez la valeur par défaut du contrôle enfant.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:textColor="#FF0000"
android:textSize="20sp"
android:textStyle="italic"
android:scaleType="center"
app:layout_cover_children="true">
<ImageView
android:layout_width="50dp"
android:src="@mipmap/ic_launcher"
android:layout_height="50dp"/>
<TextView
android:capitalize="none"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF00FF"
android:textStyle="italic"
android:text="11111" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textSize="13dp"
android:text="22222" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textSize="14dp"
android:text="333333" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textSize="15dp"
android:text="444444" />
</LinearLayout>
Attributs pris en charge
Type de contrôle | Les attributs | |
---|---|---|
Affichage | |
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
ImageView | |
|
|
Développer
Extension de propriété
SuperXml.addDecorate(object : IDecorateView() {
override fun initExtraInfo(typedArray: TypedArray): Boolean {
}
override fun decorate(view: View) {
}
})
Référence d'implémentation
internal class RadiusDecorate(var radius: Float = 0f) : IDecorateView() {
override fun initExtraInfo(typedArray: TypedArray): Boolean {
radius = typedArray.getDimension(R.styleable.decorate_view_layout_radius,0f)
return radius > 0
}
override fun decorate(view: View)= view.setRadius(radius)
}
Contrôle du remplacement OU amélioration
SuperXml.addDecorate(object :IWrapDecorateView(){
override fun decorateView(view: View): View {
}
override fun initExtraInfo(typedArray: TypedArray): Boolean {
}
})
Référence d'implémentation
internal class ScrollWrapDecorate(var canScroll: Boolean = false) : IWrapDecorateView() {
override fun initExtraInfo(typedArray: TypedArray): Boolean {
canScroll = typedArray.getBoolean(R.styleable.decorate_view_layout_canScroll, false)
return canScroll
}
override fun decorateView(view: View): View {
return ScrollViewProxy(
view,
attributeSet
)
}
}
Remplacement d'attribut
SuperXml.addCoverAttributeParse(object : AbsChildViewParse<TextView>(){
override fun createInfoView(context: Context, attributeSet: AttributeSet?): TextView {
}
override fun coverAttribute(): MutableList<*> {
}
})
Référence d'implémentation
class TextViewCoverParse : AbsChildViewParse<TextView>() {
override fun createInfoView(context: Context, attributeSet: AttributeSet?): TextView =
TextView(context, attributeSet)
override fun coverAttribute(): MutableList<*> = mutableListOf(
AttributeInfo("textSize",{ textSize }) { value -> textSize = value },
AttributeInfo("textColor",{ textColors }) { value -> setTextColor(value) },
AttributeInfo("text",{ text }) { text -> setText(text) },
AttributeInfo("maxLines",{ maxLines }) { maxLines -> setMaxLines(maxLines) },
AttributeInfo("maxEms",{ maxEms }) { maxEms -> setMaxEms(maxEms) },
AttributeInfo("textColorHint",{ hintTextColors }) { hintTextColors -> setHintTextColor(hintTextColors) },
AttributeInfo("hint",{ hint }) { hint -> setHint(hint) },
AttributeInfo("textDirection",{ textDirection }) { textDirection -> setTextDirection(textDirection) },
AttributeInfo("textStyle",{ typeface }) { typeface -> setTypeface(typeface) },
AttributeInfo("capitalize",{ inputType }) { inputType -> setInputType(inputType) }
)
}