87 votes

Comment puis-je réduire la taille de l'objet à dessiner sur un bouton ?

Comment puis-je rendre le dessinable d'un bouton plus petit ? L'icône est trop grande, elle est même plus haute que le bouton. Voici le code que j'utilise :

    <Button
    android:background="@drawable/red_button"
    android:drawableLeft="@drawable/s_vit"
    android:id="@+id/ButtonTest"
    android:gravity="left|center_vertical" 
    android:text="S-SERIES CALCULATOR"
    android:textColor="@android:color/white"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginLeft="25dp"
    android:layout_marginRight="25dp"
    android:drawablePadding="10dp">
    </Button>

Le haut est ce à quoi il devrait ressembler, le bas ce à quoi il ressemble en ce moment.

The upper is how it should look, the lower how it looks right now.

J'ai essayé mais aucune image ne s'affiche :-(

    Resources res = getResources();
    ScaleDrawable sd = new ScaleDrawable(res.getDrawable(R.drawable.s_vit), 0, 10f, 10f);
    Button btn = (Button) findViewById(R.id.ButtonTest);
    btn.setCompoundDrawables(sd.getDrawable(), null, null, null);

0 votes

Il serait préférable que vous téléchargiez une image de ce que vous obtenez et de ce que vous essayez de faire. Merci.

0 votes

Vous pouvez définir votre bouton personnalisé afin de définir la taille des objets à dessiner. Voir ma réponse ici stackoverflow.com/a/31916731/2308720

0 votes

Je sais que cela date de 2011... mais je préfère l'aspect du bouton avec la caméra qui sort des limites du bouton - je l'aurais laissé tel quel... juste pour dire :)

71voto

userSeven7s Points 14480

Vous devez utiliser un ImageButton et spécifier l'image dans android:src et définir android:scaletype à fitXY


Mise à l'échelle d'un dessinateur dans le code

Drawable drawable = getResources().getDrawable(R.drawable.s_vit);
drawable.setBounds(0, 0, (int)(drawable.getIntrinsicWidth()*0.5), 
                         (int)(drawable.getIntrinsicHeight()*0.5));
ScaleDrawable sd = new ScaleDrawable(drawable, 0, scaleWidth, scaleHeight);
Button btn = findViewbyId(R.id.yourbtnID);
btn.setCompoundDrawables(sd.getDrawable(), null, null, null); //set drawableLeft for example

0 votes

Si vous définissez le drawable dans le code, vous pouvez le redimensionner en fonction de la hauteur du bouton, puis le définir.

0 votes

Maintenant l'image est affichée mais elle n'est pas redimensionnée ! J'ai essayé des valeurs entre 0.1f et 10f. Une idée ? Merci pour votre aide...

0 votes

Essayez ceci drawable.setBounds(0, 0, drawable.getIntrinsicWidth()*0.5, drawable.getIntrinsicHeight()*0.5);

11voto

Les boutons ne redimensionnent pas leurs images intérieures.

Ma solution ne nécessite pas de manipulation de code.

Il utilise une mise en page avec TextView et ImageView.

L'arrière-plan de la mise en page doit comporter le dessinable 3d rouge.

Vous devrez peut-être définir le Android:scaleType attribut xml.

Exemple :

<LinearLayout
    android:id="@+id/list_item"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:padding="2dp" >

    <ImageView
        android:layout_width="50dp"
        android:layout_height="fill_parent"
        android:src="@drawable/camera" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:lines="1"
        android:gravity="center_vertical"
        android:text="Hello - primary" />

</LinearLayout>

BTW :

  1. Compter sur des icônes de différentes résolutions peut donner lieu à une interface utilisateur non prévisible (icône trop grande ou trop petite).
  2. Le texte dans la vue texte (y compris dans les boutons) ne remplit pas le composant. C'est un problème Android et je ne sais pas comment le résoudre.
  3. Vous pouvez l'utiliser comme un include.

Bonne chance

0 votes

RE : TextViews, si je veux que la vue soit aussi petite que possible, je fixe le padding à zéro. Sinon, elle semble avoir un padding par défaut.

6voto

zeh Points 2192

Utilisez un ScaleDrawable comme Abhinav suggéré.

Le problème est que le dessinable ne s'affiche pas alors - c'est une sorte de bug dans ScaleDrawables. Vous devrez changer le "niveau" par programme. Cela devrait fonctionner pour chaque bouton :

// Fix level of existing drawables
Drawable[] drawables = myButton.getCompoundDrawables();
for (Drawable d : drawables) if (d != null && d instanceof ScaleDrawable) d.setLevel(1);
myButton.setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]);

0 votes

Joli. Je pense que je pourrais l'utiliser dans un avenir proche !

0 votes

@zeh, maintenant j'ai trouvé que cela fonctionne si vous exécutez le code ci-dessus avant setContentView, sinon cela ne fonctionne pas. Ce serait mieux si tu ajoutais ceci à ton message.

0 votes

Pour une raison quelconque, ma solution ci-dessus ne fonctionne pas sur toutes les versions d'Android.

1voto

kingori Points 1271

Si vous voulez utiliser une seule image et l'afficher en différentes tailles, vous pouvez utiliser la fonction scale drawable ( http://developer.Android.com/guide/topics/resources/drawable-resource.html#Scale ).

0voto

Abhinav Points 10339

Avez-vous essayé d'envelopper votre image dans un ScaleDrawable et l'utiliser ensuite dans votre bouton ?

2 votes

Je viens d'essayer ceci, mais mon ScaleDrawable ne s'affiche pas :-( Même pas dans une ImageView. J'ai pris l'exemple de code et j'ai simplement remplacé le drawable. Une idée de la raison pour laquelle cela ne fonctionne pas ?

0 votes

J'ai eu le même problème. ScaleDrawable serait parfait, mais cela ne fonctionne tout simplement pas. Il semble que cela ait quelque chose à voir avec les "niveaux". Plus d'informations ici (et quelques solutions de contournement qui sont loin d'être parfaites) : stackoverflow.com/questions/5507539/

0 votes

(edit) corrigé avec du code générique ! Solution ici qui vous permet toujours d'utiliser ScaleDrawables : stackoverflow.com/a/13706836/439026

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X