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);
...
}