ImageView масштабирование

В ImageView загружаю картинку 480х606, размер ImageView на экране 1080х680. Как бы не пробовал, но не получаю желаемого результата и даже увеличивал картинку в фотошопе, а после загружал ее в ImageView но она загружалась как с исходными значениями.Если ее масштабировать centerCrop, то верх картинки обрезается, а низ остается.

Задача

Растянуть картинку в ImageView таким образом что бы вверх картинки не обрезался ImageView , а начинался как оригинал, а низ пускай срежится.


Ответы (1 шт):

Автор решения: Vind Iskald

Создать кастомный класс отнаследованный от AppCompatImageView

package com.example.myapplication;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;

public class CustomImageView extends androidx.appcompat.widget.AppCompatImageView {

    public CustomImageView(Context context) {
        super(context);
        setScaleType(ScaleType.MATRIX);
    }

    public CustomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setScaleType(ScaleType.MATRIX);
    }

    public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setScaleType(ScaleType.MATRIX);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        updateMatrix();
    }

    private void updateMatrix() {
        final Drawable drawable = getDrawable();
        if (drawable != null) {
            final Matrix matrix = getImageMatrix();
            final float viewWidth = getWidth() - getPaddingLeft() - getPaddingRight();
            final float viewHeight = getHeight() - getPaddingTop() - getPaddingBottom();
            final float drawableWidth = drawable.getIntrinsicWidth();
            final float drawableHeight = drawable.getIntrinsicHeight();
            final float scale = drawableWidth * viewHeight > drawableHeight * viewWidth ?
                viewHeight / drawableHeight : viewWidth / drawableWidth;
            matrix.setScale(scale, scale);
            setImageMatrix(matrix);
        }
    }
}

Использовать его там где необходимо подобное поведение.

<com.example.myapplication.CustomImageView
        android:id=...
        android:src=...
        android:layout_width="match_parent"
        android:layout_height="680dp"
        .../>

Чтобы задать высоту картинки в пропорциях от ширины экрана, во Фрагмете:

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        final int screenWidth = getResources().getDisplayMetrics().widthPixels;
        final ImageView image = binding.image; // Либо через findViewById(...)
        final ViewGroup.LayoutParams imageLayoutParams = image.getLayoutParams();
        final float ratio = 0.8f; // Нужное отношение высоты к ширине картинки
        imageLayoutParams.height = Math.round(screenWidth * ratio);
        
        ...
    }
→ Ссылка