2011-08-11 8 views
27

me he fijado un estirable para un diálogo de progreso (pbarDialog) pero mi problema es que quiero cambiar el tamaño de la dibujable cada vez, pero no puedo encontrar la manera.Disponibles en Android

Aquí hay un código:

Handler progressHandler = new Handler() { 

    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      // some more code 
      case UPDATE_PBAR: 
       pbarDialog.setIcon(mAppIcon); 
       pbarDialog.setMessage(mPbarMsg); 
       pbarDialog.incrementProgressBy(mIncrement+1); 
       break; 
     } 
    } 
}; 

pbarDialog.show(); 

Thread myThread = new Thread(new Runnable() { 

    public void run() { 
     // some code 
     for (int i = 0; i < mApps.size(); i++) { 
      mAppIcon = mAdapter.getIcons().get(mApps.get(i).getPackageName()); 
      // need to resize drawable here 
      progressHandler.sendEmptyMessage(UPDATE_PBAR); 
     } 
     handler.sendEmptyMessage(DISMISS_PBAR); 
    } 

}); 

myThread.start(); 
+0

¿Qué dibuja tiene que cambiar el tamaño? –

+2

use Bitmap.createScaledBitmap (src, dstWidth, dstHeight, filter) – Sameer

Respuesta

74

Los siguientes trabajó para mí:

private Drawable resize(Drawable image) { 
    Bitmap b = ((BitmapDrawable)image).getBitmap(); 
    Bitmap bitmapResized = Bitmap.createScaledBitmap(b, 50, 50, false); 
    return new BitmapDrawable(getResources(), bitmapResized); 
} 
+1

Recibí este error en la primera línea de código: java.lang.ClassCastException: android.graphics.drawable.PictureDrawable no se puede convertir a android.graphics.drawable.BitmapDrawable –

+4

usa Drawable como argumento y ejecútalo en BitmapDrawable! si estás seguro de que siempre es un mapa de bits, así que cambia el tipo de argumento a BitmapDrawable también, si no, quizás sea bueno comprobar el tipo dibujable antes del lanzamiento. –

18

Aquí es donde terminé, gracias en parte a la respuesta de Saad:

public Drawable scaleImage (Drawable image, float scaleFactor) { 

    if ((image == null) || !(image instanceof BitmapDrawable)) { 
     return image; 
    } 

    Bitmap b = ((BitmapDrawable)image).getBitmap(); 

    int sizeX = Math.round(image.getIntrinsicWidth() * scaleFactor); 
    int sizeY = Math.round(image.getIntrinsicHeight() * scaleFactor); 

    Bitmap bitmapResized = Bitmap.createScaledBitmap(b, sizeX, sizeY, false); 

    image = new BitmapDrawable(getResources(), bitmapResized); 

    return image; 

} 
+0

perfecto, este es el camino que tomé. – Tony

+0

Buena codificación. Exactamente lo que necesitaba. Gracias, hermano :) –

+0

Tenga cuidado con esto: la anterior "imagen" dibujable contiene un mapa de bits que no ha sido reciclado. Llamar a "image = scaleImage (image, 2)" causaría una fuga temporal. La persona que llama de scaleImage tiene la responsabilidad de reciclar tanto la imagen original como la escala ... Esto puede no ser un problema en aplicaciones pequeñas, pero es crítico en aplicaciones de memoria intensiva. –

5

Para el cambio de tamaño, esto es bueno y corto (el código anterior no funcionaba para mí), encontró here:

ImageView iv = (ImageView) findViewById(R.id.imageView); 
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.picture); 
    Bitmap bMapScaled = Bitmap.createScaledBitmap(bMap, newWidth, newHeight, true); 
    iv.setImageBitmap(bMapScaled); 
+0

Esto funcionó cuando quise cambiar el tamaño del Drawable antes de establecerlo como imageBitmap en un ImageView. Gracias –

1

Tal vez mi solución no cubre la pregunta por completo, pero necesitaba algo así como un "CustomDrawable".

En otras palabras, quiero establecer un logotipo delante de una forma de círculo. Así que creé un FrameLayout con un fondo (solo un círculo de color) y frente a esta forma redonda muestro el logo.

Para cambiar el tamaño del logotipo que reducir el tamaño del logotipo escalando - Aquí hay un código:

iv = new ImageView(mContext); 

iv.setScaleX(0.75f); // <- resized by scaling 
iv.setScaleY(0.75f); 

// loading the drawable from a getter (replace this with any drawable) 
Drawable drawable = ML.loadIcon(mContext, Integer.parseInt(icon)); 

iv.setImageDrawable(drawable); 

// icon get's shown inside a ListView 
viewHolder.mIvIcon.addView(iv); 

Aquí es el FrameLayout que muestra el icono dentro de la fila de ListView:

<FrameLayout 
    android:id="@+id/iv_card_icon" 
    android:layout_width="48dp" 
    android:layout_height="48dp" 
    android:src="@drawable/circle" 
    android:layout_marginStart="16dp" 
    /> 

ver este solución como una opción/idea.

Cuestiones relacionadas