ImageView заполняет родительскую ширину или высоту, но поддерживает соотношение сторон
У меня квадратное изображение (хотя эта проблема также относится к прямоугольным изображениям). Я хочу показать изображение как можно больше, растягивая их, если необходимо, чтобы заполнить их родителей, сохраняя при этом соотношение сторон. Изображение меньше, чем ImageView. Проблема в том, что я не могу растянуть изображение и "сопоставлять" высоту и ширину ImageView.
Это мой файл макета XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<ImageView android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_marginTop="10dp"/>
<TextView android:id="@+id/name"
android:layout_below="@id/image"
android:layout_alignLeft="@id/image"
android:layout_marginTop="20dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18dp"/>
<TextView android:id="@+id/name2"
android:layout_below="@id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14dp"/>
</RelativeLayout>
Я использовал множество комбинаций fill_parent
, wrap_content
с несколькими scaleTypes: fitCenter
, fitStart
, fitEnd
, centerInside
, и все они рисуют изображения в правильном соотношении сторон, но ни один из них фактически не масштабирует изображения вверх и сам ImageView, в результате чего TextViews полностью отбрасываются с экрана, пустые пространства внутри ImageView, изображение не масштабируется или обрезается изображение.
Я не могу представить правильную комбинацию для этого.
Ответы
Ответ 1
Это:
android:layout_height="wrap_content"
android:scaleType="fitStart"
android:adjustViewBounds="true"
должен изменить размер изображения и изменить размер границ, чтобы он соответствовал новому размеру изображения. Если на вашем устройстве не будет отображаться изображение, которое вы используете, и какое устройство вы тестируете.
Ответ 2
Используйте этот код:
android:scaleType="fitXY"
Подробнее о масштабировании изображения посмотрите на то, что указано в этой статье здесь
Резюме:
Центрируйте изображение в представлении, но не выполняйте масштабирование
![enter image description here]()
Равномерно масштабируйте изображение (поддерживайте пропорции изображения), чтобы обе размеры (ширина и высота) изображения были равны или больше соответствующего размера представления (минус заполнение). Затем изображение центрируется в представлении
![enter image description here]()
Равномерно масштабируйте изображение (поддерживайте пропорции изображения), чтобы обе размеры (ширина и высота) изображения были равны или меньше соответствующего размера представления (минус заполнение)
![enter image description here]()
![enter image description here]()
![enter image description here]()
![enter image description here]()
![enter image description here]()
Масштабирование с использованием матрицы изображений при рисовании
![enter image description here]()
подробнее здесь новая статья
Ответ 3
Используйте этот код с параметрами макета вида как wrapcontent
Android: adjustViewBounds = "истинный"
Надеюсь, что это сработает.
Ответ 4
Этот xml-код будет работать!. Если вы указываете, что ширина ваших приложений всегда такая же, как в окне, то android:adjustViewBounds="true"
будет устанавливать высоту, соответствующую рации изображения.
<ImageView
android:adjustViewBounds="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/screen"/>
Ответ 5
Вы пытались настроить его программно? Я думаю, что это работает очень хорошо, если вы подсчитаете высоту своего TextView
и настройте высоту и ширину изображения на основе этого.
private void adjustImageView()
{
//Get the display dimensions
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//TextView name
TextView name = (TextView) findViewById(R.id.name);
name.setText("your name text goes here");
name.measure(0, 0);
//name TextView height
int nameH = name.getMeasuredHeight();
//TextView name2
TextView name2 = (TextView) findViewById(R.id.name2);
name2.setText("your name2 text goes here");
name2.measure(0, 0);
//name2 TextView height
int name2H = name2.getMeasuredHeight();
//Original image
Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image);
//Width/Height ratio of your image
float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight();
//Calculate the new width and height of the image to display
int imageToShowHeight = metrics.heightPixels - nameH - name2H;
int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight);
//Adjust the image width and height if bigger than screen
if(imageToShowWidth > metrics.widthPixels)
{
imageToShowWidth = metrics.widthPixels;
imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
}
//Create the new image to be shown using the new dimensions
Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true);
//Show the image in the ImageView
ImageView image = (ImageView) findViewById(R.id.image);
image.setImageBitmap(imageToShow);
}
Ответ 6
У меня была такая же проблема, android: adjustViewBounds не выполняет свою работу и имеет прописку в верхней части изображения. В относительной компоновке, которая имела значения match_parent для ширины и высоты, у меня было:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitStart"
android:adjustViewBounds="true" ...
Я изменил Relative layout на Linear layout с значениями wrap_content для ширины и высоты, и теперь это нормально:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Ответ 7
Установите android:layout_height="wrap_content"
в режиме просмотра изображений.
Чтобы создать изображение с шириной, равной ширине экрана, а высота пропорционально задана в соответствии с соотношением сторон, выполните следующие действия. Здесь я упоминаю, как загрузить изображение в изображение с URL-адреса.
Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
// creating the image that maintain aspect ratio with width of image is set to screenwidth.
int width = imageView.getMeasuredWidth();
int diw = resource.getWidth();
if (diw > 0) {
int height = 0;
height = width * resource.getHeight() / diw;
resource = Bitmap.createScaledBitmap(resource, width, height, false);
}
imageView.setImageBitmap(resource);
}
});
Надеюсь, что это поможет.