Android. ImageView сохраняет соотношение сторон полноэкранного изображения

#android #imageview #aspect-ratio #scaletype

Вопрос:

У меня есть изображение на весь экран. Я получаю изображение с сервера, и оно может быть любого размера. Мне нужно отобразить это изображение во весь экран.

Однако на некоторых устройствах часть изображения обрезается.Это было связано с тем фактом, что я установил тип масштаба для своего центра обработки изображений. Соответственно, для того, чтобы все изображение отображалось на экране, а не было обрезано, я изменил тип масштаба на fitXY. Теперь ни одна часть изображения не обрезается, но fitXY не сохраняет соотношение сторон изображения, и в результате некоторые детали на изображении растягиваются.

Можно ли сохранить соотношение сторон изображения без его обрезки? Пожалуйста, помогите мне.

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

 class ScaleImageView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : AppCompatImageView(context, attrs, defStyle) {

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) = try {
        val drawable = drawable
        if (drawable == null) {
            setMeasuredDimension(0, 0)
        } else {
            val measuredWidth = MeasureSpec.getSize(widthMeasureSpec)
            val measuredHeight = MeasureSpec.getSize(heightMeasureSpec)
            if (measuredHeight == 0 amp;amp; measuredWidth == 0) {
                setMeasuredDimension(measuredWidth, measuredHeight)
            } else if (measuredHeight == 0) { 
                val height = measuredWidth * drawable.intrinsicHeight / drawable.intrinsicWidth
                setMeasuredDimension(measuredWidth, height)
            } else if (measuredWidth == 0) { 
                val width = measuredHeight * drawable.intrinsicWidth / drawable.intrinsicHeight
                setMeasuredDimension(width, measuredHeight)
            } else { 
                setMeasuredDimension(measuredWidth, measuredHeight)
            }
        }
    } catch (e: Exception) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }
}
 

Я тоже пробовал этот способ:

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

Но в этом случае изображение обрезается сверху и снизу(