Установите изображение в ImageView, сохраните пропорции и измените размер ImageView на размеры изображения?
Как установить образ случайного размера на ImageView
?
Когда:
- Первоначально размеры
ImageView
: 250dp * 250dp
- Размер изображения большего размера должен быть увеличен/уменьшен до 250 дп
- Изображение должно сохранять его соотношение сторон
- Размеры
ImageView
должны соответствовать размерам масштабированного изображения после масштабирования
например. для изображения 100 * 150 изображение и ImageView
должно быть 166 * 250.
Например. для изображения 150 * 100 изображение и ImageView
должно быть 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.
Ответы
Ответ 1
(Ответ был сильно изменен после пояснений к исходному вопросу)
После разъяснений:
Этот не может быть выполнен только в xml. Невозможно масштабировать как изображение, так и ImageView
, так что одно измерение размером всегда будет 250dp, а ImageView
будет иметь те же размеры, что и изображение.
Этот код масштабирует Drawable
для ImageView
, чтобы оставаться на квадрате, таком как 250dp x 250dp, с одним размером точно 250dp и сохраняющим соотношение сторон. Затем размер ImageView
изменяется в соответствии с размерами масштабированного изображения. Код используется в действии. Я тестировал его с помощью обработчика кнопок.
Enjoy.:)
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 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:
Добавлена проверка нулевого указателя, как предложено в комментариях
Ответ 2
Не может быть ответа на этот конкретный вопрос, но если кто-то, как и я, ищет ответ, как подобрать образ в ImageView с ограниченным размером (например, maxWidth
) при сохранении соотношения сторон, а затем избавиться от чрезмерного пространство, занимаемое ImageView, то самым простым решением является использование следующих свойств в XML:
android:scaleType="centerInside"
android:adjustViewBounds="true"
Ответ 3
<ImageView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:adjustViewBounds="true"/>
Ответ 4
Код "Ниже" делает растровое изображение совершенно одинаковым размером изображения. Получите высоту и ширину растрового изображения, а затем вычислите новую высоту и ширину с помощью параметров изображения. Это даст вам требуемое изображение с наилучшим соотношением сторон.
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)
пользоваться.
Ответ 5
попробуйте добавить android:scaleType="fitXY"
к вашему ImageView
.
Ответ 6
После поиска дня я думаю, что это самое простое решение:
imageView.getLayoutParams().width = 250;
imageView.getLayoutParams().height = 250;
imageView.setAdjustViewBounds(true);
Ответ 7
Лучшим решением, которое работает в большинстве случаев, является
Вот пример:
<ImageView android:id="@+id/avatar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"/>
Ответ 8
все это можно сделать с помощью 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">
Ответ 9
Отредактировано Ярно Аргилландерс ответ:
Как установить изображение с помощью вашей ширины и высоты:
1) Инициализируйте ImageView и установите Image:
iv = (ImageView) findViewById(R.id.iv_image);
iv.setImageBitmap(image);
2) Теперь измените размер:
scaleImage(iv);
Отредактированный метод 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" />
Ответ 10
Используйте этот код:
<ImageView android:id="@+id/avatar"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:scaleType="fitXY" />
Ответ 11
Это сделало это для моего случая.
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:scaleType="centerCrop"
android:adjustViewBounds="true"
/>
Ответ 12
Мне нужно было иметь ImageView и Bitmap, поэтому Bitmap масштабируется до размера ImageView, а размер ImageView - тот же размер масштабируемого Bitmap:).
Я просматривал этот пост, чтобы узнать, как это сделать, и, наконец, сделал то, что я хочу, а не описанный здесь способ.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/acpt_frag_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/imageBackground"
android:orientation="vertical">
<ImageView
android:id="@+id/acpt_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:layout_margin="@dimen/document_editor_image_margin"
android:background="@color/imageBackground"
android:elevation="@dimen/document_image_elevation" />
а затем в методе onCreateView
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_scanner_acpt, null);
progress = view.findViewById(R.id.progress);
imageView = view.findViewById(R.id.acpt_image);
imageView.setImageBitmap( bitmap );
imageView.getViewTreeObserver().addOnGlobalLayoutListener(()->
layoutImageView()
);
return view;
}
а затем layoutImageView() code
private void layoutImageView(){
float[] matrixv = new float[ 9 ];
imageView.getImageMatrix().getValues(matrixv);
int w = (int) ( matrixv[Matrix.MSCALE_X] * bitmap.getWidth() );
int h = (int) ( matrixv[Matrix.MSCALE_Y] * bitmap.getHeight() );
imageView.setMaxHeight(h);
imageView.setMaxWidth(w);
}
И результат заключается в том, что изображение прекрасно вписывается в него, сохраняя соотношение сторон,
и не имеет лишних оставшихся пикселей из ImageView, когда битмап внутри.
Результат
Важно, чтобы ImageView имел
wrap_content и adjustViewBounds - true,
то setMaxWidth и setMaxHeight будут работать, это написано в исходном коде ImageView,
/*An optional argument to supply a maximum height for this view. Only valid if
* {@link #setAdjustViewBounds(boolean)} has been set to true. To set an image to be a
* maximum of 100 x 100 while preserving the original aspect ratio, do the following: 1) set
* adjustViewBounds to true 2) set maxWidth and maxHeight to 100 3) set the height and width
* layout params to WRAP_CONTENT. */
Ответ 13
Мне нужно было сделать это в компоновке ограничений с помощью 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 - мой собственный статический класс для использования методов и констант загрузки изображений.
Ответ 14
Я использую очень простое решение. Вот мой код:
imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.getLayoutParams().height = imageView.getLayoutParams().width;
imageView.setMinimumHeight(imageView.getLayoutParams().width);
Мои изображения добавляются динамически в сетку. Когда вы делаете эти настройки для просмотра изображений, изображение может автоматически отображаться в соотношении 1:1.
Ответ 15
Используйте Простую математику, чтобы изменить размер изображения. Либо вы можете изменить размер ImageView
, либо вы можете изменить размер нарисованного изображения, чем установлено в ImageView
. найдите ширину и высоту вашего растрового изображения, которое вы хотите установить на ImageView
, и вызовите нужный метод. Предположим, ваша ширина 500 больше высоты, чем вызов метода
//250 is the width you want after resize bitmap
Bitmat bmp = BitmapScaler.scaleToFitWidth(bitmap, 250) ;
ImageView image = (ImageView) findViewById(R.id.picture);
image.setImageBitmap(bmp);
Вы используете этот класс для изменения размера растрового изображения.
public class BitmapScaler{
// Scale and maintain aspect ratio given a desired width
// BitmapScaler.scaleToFitWidth(bitmap, 100);
public static Bitmap scaleToFitWidth(Bitmap b, int width)
{
float factor = width / (float) b.getWidth();
return Bitmap.createScaledBitmap(b, width, (int) (b.getHeight() * factor), true);
}
// Scale and maintain aspect ratio given a desired height
// BitmapScaler.scaleToFitHeight(bitmap, 100);
public static Bitmap scaleToFitHeight(Bitmap b, int height)
{
float factor = height / (float) b.getHeight();
return Bitmap.createScaledBitmap(b, (int) (b.getWidth() * factor), height, true);
}
}
XML-код
<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"
android:scaleType="fitcenter" />
Ответ 16
если он не работает, замените android: background на android: src
Android: Src будет играть главную хитрость
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/bg_hc" />
это работает нормально, как шарм
![enter image description here]()