web-dev-qa-db-fra.com

Android Drawable: Spécifier la largeur de la forme en pourcentage dans le fichier XML?

J'essaie de créer un Drawable simple que je veux définir comme arrière-plan pour une vue (avec setBackgroundDrawable ). Je veux simplement diviser le fond du dessinable en 2 rectangles égaux (50% - 50%), le premier veux rempli de noir, le second de blanc:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/back_color_1">
        <shape Android:shape="rectangle">
          <solid Android:color="#000000" />
        </shape>
    </item>
    <item Android:id="@+id/back_color_2">
        <shape Android:shape="rectangle">
          <solid Android:color="#FFFFFF" />
        </shape>
    </item>
</layer-list>

Comment puis-je spécifier que chaque forme doit avoir une largeur de 50% dans le fichier de définition XML dessinable? Quelque chose comme Android: width = "50%" .

(Je travaille sur Android 3.0, mais je pense que c'est une question générale sur Android.)

P.S: Vous pouvez le faire en CSS ou en XAML.

23
Alex Vang

Vous ne pouvez pas spécifier de pourcentage . Vous devez lui spécifier une valeur de dimension. 

Android:width est défini ici: http://developer.Android.com/reference/Android/R.attr.html#width :

(c'est moi qui souligne)

Doit être une valeur de dimension , qui est un nombre à virgule flottante ajouté à une unité telle que "14.5sp". Les unités disponibles sont: px (pixels), dp (pixels indépendants de la densité), sp (pixels redimensionnés en fonction de la taille de police préférée), in (pouces), mm (millimètres). 

Pour une définition de chaque type de dimension, voir: http://developer.Android.com/guide/topics/resources/more-resources.html#Dimension

Vous devrez créer votre propre attribut (voir styleable ) et effectuer les calculs vous-même dans onDraw(...).

Voir ces deux questions et les liens qui y figurent pour des exemples:

10
Aleadam

Android: layout_weight = ". 20" est la meilleure façon de mettre en œuvre en pourcentage

<?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="fill_parent"
Android:orientation="vertical" >
<TextView
    Android:id="@+id/logTextBox"
    Android:layout_width="fill_parent"
    Android:layout_height="0dp"
    Android:layout_weight=".20"
    Android:maxLines="500"
    Android:scrollbars="vertical"
    Android:singleLine="false"
    Android:text="@string/logText" >
</TextView>

</LinearLayout>
3
Swapnil Kotwal

il n'y a pas de vrai pourcentage, mais vous pourriez vous en approcher.

pour ce faire, il semble que le moyen le plus simple consiste à utiliser une image comme dessin d’arrière-plan et à créer une image fractionnée en noir et blanc.

le seul autre moyen que je connaisse pour scinder quelque chose consiste à utiliser 2 vues, chacune avec sa propre couleur bg, et chacune ayant la même valeur positive pour Android: attribut layout_weight (c'est-à-dire 50/50). ils se partageront ensuite l'espace disponible.

j'espère que cela t'aides!

3
chris

Pour ce faire, j'ai créé ma propre classe héritant de RelativeLayout, dans laquelle je substitue la méthode onMeasure. À ce stade, la hauteur de la vue est connue, j'ai donc récupéré l'arrière-plan et défini manuellement l'encart des éléments à l'aide de setLayerInset .

    LayerDrawable bg = (LayerDrawable)getBackground();
    int h = getMeasuredHeight();
    bg.setLayerInset(1, 0, 0, 0, h/2);

Cette méthode est cependant un peu lourde. Dans la plupart des cas, la réponse fournie par chris devrait suffire.

2
Skymt

Comme indiqué dans swapnil, la meilleure solution consiste à utiliser layout_weight dans LinearLayout. Si vous optez pour une orientation horizontale, définissez layout_width sur "fill_parent", puis définissez-le sur un pourcentage souhaité. Commencez avec quelque chose comme ci-dessous et jouez avec les valeurs layout_width pour en avoir une idée (ou ajoutez d'autres vues pour avoir une meilleure compréhension).

<LinearLayout    
      Android:layout_width="fill_parent"
      Android:layout_height="wrap_content"
      Android:orientation = "horizontal" >

    <View
      Android:layout_width="fill_parent"
      Android:layout_height="30dip"
      Android:layout_weight="0.5"
      Android:background="#aaffaa" />
    <View
      Android:layout_width="fill_parent"
      Android:layout_height="30dip"
      Android:layout_weight="0.5"
      Android:background="#aaaaff" />
</LinearLayout>
0
ajacian81