Установите изображение в ImageView, сохраните пропорции и измените размер ImageView на размеры изображения?

Как подогнать образ случайного размера к ImageView ?
Когда:

  • Первоначально размеры ImageView 250dp * 250dp
  • Размер изображения большего размера должен быть увеличен / уменьшен до 250dp
  • Изображение должно сохранять пропорции
  • Размеры ImageView должны соответствовать размерам масштабируемого изображения после масштабирования

Например, для изображения 100 * 150 изображение и изображение должны быть 166 * 250.
Например, для изображения размером 150 * 100 изображение и изображение должны быть 250 * 166.

Если я устанавливаю границы как

 <ImageView android:id="@+id/picture" android:layout_width="250dp" android:layout_height="250dp" android:layout_gravity="center_horizontal" android:layout_marginTop="20dp" android:adjustViewBounds="true" /> 

Изображения правильно помещаются в ImageView , но ImageView всегда 250dp * 250dp.

Solutions Collecting From Web of "Установите изображение в ImageView, сохраните пропорции и измените размер ImageView на размеры изображения?"

(Ответ был сильно изменен после уточнения первоначального вопроса)

После уточнений:
Это невозможно сделать только в xml . Невозможно масштабировать как изображение, так и ImageView так что один размер изображения всегда будет 250 дп, а ImageView будет иметь те же размеры, что и изображение.

Этот код масштабирует Drawable of 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

ОБНОВЛЕНИЕ 7 ноября, 2012:
Добавлена ​​проверка нулевого указателя, как предложено в комментариях

Не может быть ответа на этот конкретный вопрос, но если кто-то, как и я, ищет ответ, как подобрать образ в ImageView с ограниченным размером (например, maxWidth ), сохраняя при этом соотношение сторон, а затем избавиться от избыточного пространства, занимаемого ImageView, То самым простым решением является использование следующих свойств в XML:

  android:scaleType="centerInside" android:adjustViewBounds="true" 
 <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:adjustViewBounds="true"/> 

Код «Ниже» делает растровое изображение совершенно одинаковым размером изображения. Получите высоту и ширину растрового изображения, а затем вычислите новую высоту и ширину с помощью параметров изображения. Это даст вам требуемое изображение с наилучшим соотношением сторон.

 int currentBitmapWidth = bitMap.getWidth(); int currentBitmapHeight = bitMap.getHeight(); int ivWidth = imageView.getWidth(); int ivHeight = imageView.getHeight(); int newWidth = ivWidth; newHeight = (int) Math.floor((double) currentBitmapHeight *( (double) new_width / (double) currentBitmapWidth)); Bitmap newbitMap = Bitmap.createScaledBitmap(bitMap, newWidth, newHeight, true); imageView.setImageBitmap(newbitMap) 

наслаждаться.

Попробуйте добавить android:scaleType="fitXY" к вашему ImageView .

После поиска в течение дня, я думаю, что это самое простое решение:

 imageView.getLayoutParams().width = 250; imageView.getLayoutParams().height = 250; imageView.setAdjustViewBounds(true); 

Отредактированный Ярно Argillanders ответ:

Как установить изображение с вашей шириной и высотой:

1) Инициализировать ImageView и установить изображение:

 iv = (ImageView) findViewById(R.id.iv_image); iv.setImageBitmap(image); 

2) Теперь измените размер:

 scaleImage(iv); 

scaleImage метод scaleImage : ( вы можете заменить ОЖИДАЕМЫЕ ограничивающие значения )

 private void scaleImage(ImageView view) { Drawable drawing = view.getDrawable(); if (drawing == null) { return; } Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); int xBounding = ((View) view.getParent()).getWidth();//EXPECTED WIDTH int yBounding = ((View) view.getParent()).getHeight();//EXPECTED HEIGHT float xScale = ((float) xBounding) / width; float yScale = ((float) yBounding) / height; Matrix matrix = new Matrix(); matrix.postScale(xScale, yScale); Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); width = scaledBitmap.getWidth(); height = scaledBitmap.getHeight(); BitmapDrawable result = new BitmapDrawable(context.getResources(), scaledBitmap); view.setImageDrawable(result); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); params.width = width; params.height = height; view.setLayoutParams(params); } 

И .xml:

 <ImageView android:id="@+id/iv_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /> 

Используйте этот код:

 <ImageView android:id="@+id/avatar" android:layout_width="fill_parent" android:layout_height="match_parent" android:scaleType="fitXY" /> 

Все это можно сделать с помощью XML … другие методы кажутся довольно сложными. В любом случае, вы просто установите высоту того, что когда-либо захотите в dp, затем установите ширину для обертывания содержимого или наоборот. Используйте scaleType fitCenter для настройки размера изображения.

 <ImageView android:layout_height="200dp" android:layout_width="wrap_content" android:scaleType="fitCenter" android:adjustViewBounds="true" android:src="@mipmap/ic_launcher" android:layout_below="@+id/title" android:layout_margin="5dip" android:id="@+id/imageView1"> 

Это сделало это для моего дела.

  <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:scaleType="centerCrop" android:adjustViewBounds="true" /> 

Мне нужно было сделать это в компоновке ограничений с Picasso, поэтому я собрал некоторые из вышеперечисленных ответов и придумал это решение (я уже знаю соотношение сторон изображения, которое загружаю, так что это помогает):

Вызывается в моем коде активности где-то после setContentView (…)

 protected void setBoxshotBackgroundImage() { ImageView backgroundImageView = (ImageView) findViewById(R.id.background_image_view); if(backgroundImageView != null) { DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int width = displayMetrics.widthPixels; int height = (int) Math.round(width * ImageLoader.BOXART_HEIGHT_ASPECT_RATIO); // we adjust the height of this element, as the width is already pinned to the parent in xml backgroundImageView.getLayoutParams().height = height; // implement your Picasso loading code here } else { // fallback if no element in layout... } } 

В моем XML

 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout_editor_absoluteY="0dp" tools:layout_editor_absoluteX="0dp"> <ImageView android:id="@+id/background_image_view" android:layout_width="0dp" android:layout_height="0dp" android:scaleType="fitStart" app:srcCompat="@color/background" android:adjustViewBounds="true" tools:layout_editor_absoluteY="0dp" android:layout_marginTop="0dp" android:layout_marginBottom="0dp" android:layout_marginRight="0dp" android:layout_marginLeft="0dp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"/> <!-- other elements of this layout here... --> </android.support.constraint.ConstraintLayout> 

Обратите внимание на отсутствие атрибута constraintBottom_toBottomOf. ImageLoader – мой собственный статический класс для утилиты загрузки изображений и констант.