2011-07-02 15 views
13

Actualmente mi dibujo simplemente se adapta a su tamaño normal, quiero que encaje dentro de mi botón. Aquí está una imagen de cómo se ve ahora:¿Escalar un dibujo dentro de un botón?

enter image description here

Aquí está el código XML para el botón:

<LinearLayout android:layout_width="wrap_content" 
    android:id="@+id/linearLayout2" android:layout_height="40dp" 
    android:layout_weight="0.4" android:gravity="right|center_vertical" 
    android:paddingRight="5dp"> 
    <Button android:id="@+id/button1" android:background="@drawable/refresh" 
     android:layout_height="25dp" android:layout_width="150dp" 
     android:text="@string/buttonSearchAgain" android:drawableRight="@drawable/refresh_48"></Button> 
</LinearLayout> 

por lo que quiero que se vea como esto:

enter image description here

¿Hay alguna manera de reducir mi drawable?

Respuesta

2

recrear la imagen. Mantenga el tamaño de la imagen en píxeles, pero reduzca el tamaño de la flecha y haga que el resto sea transparente. Esa es mi apuesta de todos modos =)

+0

Parece que tendré que ir con eso. –

+1

¿Por qué los píxeles son mejores que la inmersión? –

+0

Creo que estás malinterpretando mi respuesta: no quiero decir que los píxeles sean mejores que la inmersión. Cuando escribí "Mantener tamaño de imagen en píxeles ... []" me refiero a la imagen .png real y no a algún elemento xml. – Emiam

0

Trate

<Button android:id="@+id/button1" android:background="@drawable/refresh" 
    android:layout_height="25dp" android:layout_width="150dp" 
    android:text="@string/buttonSearchAgain" android:drawableRight="@drawable/refresh_48" 
    android:padding="5dp"></Button> 

(Así que añadir android:padding="5dp")

+0

Ahora parece que esto: http://i.imgur.com/7DJL3 .png –

0

¡Lo hice funcionar! Es un poco desordenado, y terminé no usando las vistas de botones en absoluto. El "botón" en sí es un Layout relativo, por lo que si quieres usar esta solución, tendrás que jugar con algunos si quieres que el botón se active. Aquí está mi XML:

<LinearLayout android:layout_width="wrap_content" 
    android:id="@+id/linearLayout2" android:layout_height="40dp" 
    android:layout_weight="0.4" android:gravity="right|center_vertical" 
    android:paddingRight="5dp"> 
    <RelativeLayout android:layout_height="25dp" 
     android:layout_width="150dp" android:id="@+id/relativeLayout1" 
     android:clickable="true"> 
     <ImageView android:id="@+id/imageView1" android:scaleType="fitXY" 
      android:adjustViewBounds="true" android:layout_width="fill_parent" 
      android:src="@drawable/saywhat" android:layout_height="fill_parent"></ImageView> 
     <LinearLayout android:layout_width="fill_parent" 
      android:id="@+id/linearLayout3" android:weightSum="1" 
      android:layout_height="fill_parent"> 
      <TextView android:layout_weight="0.6" 
       android:layout_height="fill_parent" android:text="TextView" 
       android:layout_width="wrap_content" android:id="@+id/textView1"></TextView> 
      <LinearLayout android:layout_weight="0.4" 
       android:layout_height="fill_parent" android:layout_width="wrap_content" 
       android:id="@+id/linearLayout4"> 
       <ImageView android:id="@+id/imageView2" 
        android:layout_height="wrap_content" android:scaleType="fitXY" 
        android:adjustViewBounds="true" android:layout_width="wrap_content" 
        android:src="@drawable/refresh_48"></ImageView> 
      </LinearLayout> 
     </LinearLayout> 
    </RelativeLayout> 
</LinearLayout> 

Enjoy :)

+8

Este es un botón complicado muy innecesario: P – Jona

+1

Eso sería un botón demasiado malvado. –

+8

Volviendo a visitar esta respuesta después de muchos años de experiencia en Android, puedo decir con seguridad que ni siquiera debería pensar en implementarla de esta manera. –

3

Como no se puede modificar o escalar la imagen a través de XML es necesario establecer los límites dibujable compuestos dentro del código.

Reemplace la clase Button con su propio "CustomButton". Entonces anular los SetCompoundDrawables método"(izquierda, arriba, derecha, abajo):.

public override void SetCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) 
    { 
     if (right != null) 
     { 
      var bounds = right.Bounds; 
      right.SetBounds(bounds.Left, bounds.Top, bounds.Right, bounds.Bottom - 70); 
     } 

     if (left != null) 
     { 
      var bounds = left.Bounds; 
      left.SetBounds(bounds.Left, bounds.Top, bounds.Right, bounds.Bottom - 70); 
     } 

     base.SetCompoundDrawables(left, top, right, bottom); 
    } 

Tenga en cuenta que este es C# Código Desde que estoy usando Xamarin Sin embargo, el código de Java debe ser el mismo (a pesar de algunas uppper namings caso)

1

creo que he encontrado la solución para su problema, muy tarde pero podría ayudar a los demás

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); 
4

puede resolver esto mediante programación: Tener un vistazo a la función scaleButtonDrawables en this answer Con esa función. puedes escribir onCreate() de su actividad:

final Button button = (Button) findViewById(R.id.button1); 
ViewTreeObserver vto = button.getViewTreeObserver(); 
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      public boolean onPreDraw() { 
       button.getViewTreeObserver().removeOnPreDrawListener(this); 
       //scale to 90% of button height 
       DroidUtils.scaleButtonDrawables(button, 0.9); 
       return true; 
      } 
     }); 

(. No se puede llamar directamente porque esta altura botón no está disponible en onCreate())

+0

¡Gracias! Trabajos. – DmitryKanunnikoff

Cuestiones relacionadas