(원래 질문에 대한 설명을 한 후 답변이 크게 수정되었습니다)
해명 후 :
이것은 단지 XML로 수행 할 수 없습니다 . ImageView
이미지의 한 치수가 항상 250dp이고 ImageView
이미지와 치수가 동일 하도록 이미지와 크기를 모두 조정할 수는 없습니다 .
이 코드는 크기 Drawable
가 ImageView
250dp x 250dp와 같은 정사각형에 정확히 250dp로 유지되고 종횡비를 유지하도록 확장됩니다. 그런 다음 ImageView
크기가 조정 된 이미지의 크기와 일치하도록 크기가 조정됩니다. 코드는 활동에 사용됩니다. 버튼 클릭 핸들러를 통해 테스트했습니다.
즐겨. :)
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);
}
의 XML 코드 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"/>
스케일링 코드에 대한 다음 토론 덕분에
http://www.anddev.org/resize_and_rotate_image_-_example-t621.html
2012 년 11 월 7 일 업데이트 :
의견에서 제안한대로 널 포인터 검사가 추가되었습니다.
ImageView
이미지 크기로 변경 하시겠습니까? 예를 들어 100dp x 150dp의 이미지가ImageView
동일한 측정 값으로 확장 됩니까? 또는 이미지를ImageView
경계 에 맞게 스케일링하는 방법을 의미합니까? 예를 들어 1000dp x 875dp의 이미지는 250dp x 250dp로 크기가 조정됩니다. 종횡비를 유지해야합니까?