(La réponse a été fortement modifiée après des clarifications de la question originale)
Après les clarifications :
Ce site ne peut pas être fait en xml seulement . Il n'est pas possible de mettre à l'échelle à la fois l'image et l'écran. ImageView
de sorte que l'une des dimensions de l'image soit toujours de 250dp et que le ImageView
aurait les mêmes dimensions que l'image.
Ce code met à l'échelle Drawable
d'un ImageView
pour rester dans un carré comme 250dp x 250dp avec une dimension exactement 250dp et en gardant le rapport d'aspect. Ensuite, le ImageView
est redimensionnée pour correspondre aux dimensions de l'image mise à l'échelle. Le code est utilisé dans une activité. Je l'ai testé via le gestionnaire de clic de bouton.
Profitez-en. :)
private void scaleImage(ImageView view) throws NoSuchElementException {
// Get bitmap from the the ImageView.
Bitmap bitmap = null;
try {
Drawable drawing = view.getDrawable();
bitmap = ((BitmapDrawable) drawing).getBitmap();
} catch (NullPointerException e) {
throw new NoSuchElementException("No drawable on given view");
} catch (ClassCastException e) {
// Check bitmap is Ion drawable
bitmap = Ion.with(view).getBitmap();
}
// Get current dimensions AND the desired bounding box
int width = 0;
try {
width = bitmap.getWidth();
} catch (NullPointerException e) {
throw new NoSuchElementException("Can't find bitmap on given view/drawable");
}
int height = bitmap.getHeight();
int bounding = dpToPx(250);
Log.i("Test", "original width = " + Integer.toString(width));
Log.i("Test", "original height = " + Integer.toString(height));
Log.i("Test", "bounding = " + Integer.toString(bounding));
// Determine how much to scale: the dimension requiring less scaling is
// closer to the its side. This way the image always stays inside your
// bounding box AND either x/y axis touches it.
float xScale = ((float) bounding) / width;
float yScale = ((float) bounding) / height;
float scale = (xScale <= yScale) ? xScale : yScale;
Log.i("Test", "xScale = " + Float.toString(xScale));
Log.i("Test", "yScale = " + Float.toString(yScale));
Log.i("Test", "scale = " + Float.toString(scale));
// Create a matrix for the scaling and add the scaling data
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
// Create a new bitmap and convert it to a format understood by the ImageView
Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
width = scaledBitmap.getWidth(); // re-use
height = scaledBitmap.getHeight(); // re-use
BitmapDrawable result = new BitmapDrawable(scaledBitmap);
Log.i("Test", "scaled width = " + Integer.toString(width));
Log.i("Test", "scaled height = " + Integer.toString(height));
// Apply the scaled bitmap
view.setImageDrawable(result);
// Now change ImageView's dimensions to match the scaled image
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
Log.i("Test", "done");
}
private int dpToPx(int dp) {
float density = getApplicationContext().getResources().getDisplayMetrics().density;
return Math.round((float)dp * density);
}
Le code xml pour le ImageView
:
<ImageView a:id="@+id/image_box"
a:background="#ff0000"
a:src="@drawable/star"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_marginTop="20dp"
a:layout_gravity="center_horizontal"/>
Merci à cette discussion pour le code de mise à l'échelle :
http://www.anddev.org/resize_and_rotate_image_-_example-t621.html
MISE À JOUR du 7 novembre 2012 :
Ajout de la vérification des pointeurs nuls comme suggéré dans les commentaires
0 votes
Euh, voulez-vous dire pour changer la taille de la
ImageView
à la taille de l'image ? Par exemple, une image de 100 dp x 150 dp serait mise à l'échelle.ImageView
aux mêmes mesures ? Ou voulez-vous dire comment mettre à l'échelle l'image auxImageView
limites. Par exemple, une image de 1000dp x 875dp sera mise à l'échelle en 250dp x 250dp. Avez-vous besoin de maintenir le rapport d'aspect ?0 votes
Je veux que l'ImageView ait les dimensions de l'image, que la plus grande dimension de l'image soit égale à 250dp et qu'elle conserve son rapport d'aspect. Par exemple, pour une image de 100*150, je veux que l'image et l'ImageView soient de 166*250. Je vais mettre à jour ma question.
0 votes
Souhaitez-vous effectuer une mise à l'échelle/un ajustement uniquement lors de l'affichage d'une activité (à faire une fois) ou lors d'une action sur l'activité comme la sélection d'une image dans la galerie/le Web (à faire plusieurs fois mais pas au chargement) ou les deux ?
0 votes
Voir ma réponse modifiée, qui devrait faire exactement ce que vous souhaitez :)