как подогнать изображение по ширине и сохранить соотношение сторон в Android

#android #android-layout #imageview #android-imageview

#Android #android-layout #просмотр изображений #android-imageview

Вопрос:

У меня есть ImageView с фиксированной высотой и шириной (скажем, с шириной 100dp и высотой 50dp). Мне нужно динамически загружать изображение в этот вид изображения.

Я хочу, чтобы это изображение масштабировалось таким образом, чтобы оно заполняло ширину ImageView, но сохраняло соотношение сторон (меня не волнует, если часть изображения не видна из-за ограничения высоты).

то, что я хочу, действительно похоже на centerCrop , но я не хочу, чтобы мое изображение было центрировано по вертикали!

заранее спасибо.

правка1:

вот мои коды:

это мой макет. Я хочу установить изображение для ImageView с background идентификатором.

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<ImageView
    android:id="@ id/background"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignTop="@ id/footer"
    android:layout_alignBottom="@id/footer"
    />

<RelativeLayout
    android:id="@ id/footer"
    android:layout_width="match_parent"
    android:layout_height="100dp">

</RelativeLayout>
  

обратите внимание, что ImageView привязан к размеру второго RelativeLayout:

     android:layout_alignTop="@ id/footer"
    android:layout_alignBottom="@id/footer"
  

Ответ №1:

сначала в вашем макете добавьте

 android:scaleType="matrix"
  

к вашему ImageView.

затем в вашем Java-коде добавьте это:

 ackground.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(),
                    R.drawable.background_image);

            float imageRatio = (float) backgroundBitmap.getWidth() / (float) backgroundBitmap.getHeight();

            int imageViewWidth = background.getWidth();
            int imageRealHeight = (int) (imageViewWidth / imageRatio);

            Bitmap imageToShow = Bitmap.createScaledBitmap(backgroundBitmap, imageViewWidth, imageRealHeight, true);
            background.setImageBitmap(imageToShow);

        }
    });
  

Я разберу это для вас:

в Java-коде вы создаете растровый объект с желаемой шириной (вашей шириной ImageView) и устанавливаете его в вашем ImageView. но вам нужно преобразовать ваш ImageView scaleType в matrix, чтобы Android не мог автоматически масштабировать его!

Комментарии:

1. возможно ли сделать именно это, не преобразуя рисованное изображение в растровое? для моего использования это действительно медленно.

2. Вы хоть представляете, как долго я искал именно это! 1

Ответ №2:

Давайте предположим, что у вас есть Bitmap изображение, а именно ImageBitmap, и ImageView , а именно myImageView. Вот как изменить его размер, чтобы оно заполняло всю ширину вашего imageview с сохранением соотношения сторон:

 float imageOriginalWidthHeightRatio = (float) imageBitmap.getWidth() / (float) imageBitmap.getHeight();

int imageToShowWidth = myImageView.getWidth()
int imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);

Bitmap imageToShow = Bitmap.createScaledBitmap(imageBitmap, imageToShowWidth, imageToShowHeight, true);
myImageView.setImageBitmap(imageToShow);
  

Комментарии:

1. спасибо за ваш ответ. Это сработало с моей собственной небольшой настройкой 🙂

Ответ №3:

Я думаю, вы можете просто установить высоту ImageView, например, на 50dp, и попытаться изменить scaleType на один из описанных в этой ссылке:https://developer.android.com/reference/android/widget/ImageView.ScaleType.html. Я не помню, что именно делает.

Комментарии:

1. это не работает! Я боролся с этим уже несколько дней. самым близким типом масштаба, с которым я столкнулся, был centerCrop, но мне не нужна функция централизации!!!

Ответ №4:

Чтобы создать изображение, ширина которого равна ширине экрана, а высота пропорционально задана в соответствии с соотношением сторон, выполните следующие действия. Здесь я упоминаю, как загрузить изображение в imageview с 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);
                    }
                });
  

Надеюсь, это поможет. 🙂