Изменение размеров ImageView для по соотношению сторон
мне нужно изменить размер ImageView так, чтобы он соответствовал экрану, поддерживает то же соотношение сторон. Выполняются следующие условия:
- изображения имеют фиксированную ширину (размер ширины экрана)
- картинки загружаются из Интернета, т. е. размер может быть определен только позднее
- соотношение сторон для каждого изображения будет меняться; некоторые из них высокие, некоторые квадратные, некоторые плоские
- ImageView высота изменить, или больше или меньше на основе соотношения сторон
- избыточная высота обрезается, не может иметь много пустого пространства, как по умолчанию.
например, крошечное изображение 50x50 на экране шириной 400 пикселей будет масштабировать изображение до 400x400 пикселей. Изображение 800x200 бы накипь 400x100.
Я просмотрел большинство других потоков, и многие предлагаемые решения, такие как просто изменение adjustViewBounds
и scaleType
будет только масштабировать изображение, а не масштабировать его вверх.
3 ответов
Я создал его с помощью этого ответа Боба Ли в этом посте:Android: Как растянуть изображение на ширину экрана при сохранении соотношения сторон?
package com.yourpackage.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
public class AspectRatioImageView extends ImageView {
public AspectRatioImageView(Context context) {
super(context);
}
public AspectRatioImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
setMeasuredDimension(width, height);
}
}
теперь использовать его в XML:
<com.yourpackage.widgets.AspectRatioImageView android:layout_centerHorizontal="true"
android:src="@drawable/yourdrawable" android:id="@+id/image"
android:layout_alignParentTop="true" android:layout_height="wrap_content"
android:layout_width="match_parent" android:adjustViewBounds="true" />
удачи!
ImageView mImageView; // This is the ImageView to change
// Use this in onWindowFocusChanged so that the ImageView is fully loaded, or the dimensions will end up 0.
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
// Abstracting out the process where you get the image from the internet
Bitmap loadedImage = getImageFromInternet (url);
// Gets the width you want it to be
intendedWidth = mImageView.getWidth();
// Gets the downloaded image dimensions
int originalWidth = loadedImage.getWidth();
int originalHeight = loadedImage.getHeight();
// Calculates the new dimensions
float scale = (float) intendedWidth / originalWidth;
int newHeight = (int) Math.round(originalHeight * scale);
// Resizes mImageView. Change "FrameLayout" to whatever layout mImageView is located in.
mImageView.setLayoutParams(new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT));
mImageView.getLayoutParams().width = intendedWidth;
mImageView.getLayoutParams().height = newHeight;
}
Я предпочитаю ответ Agarwal с некоторыми изменениями, потому что он resuable:
package com.yourpackage.widgets;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class AspectRatioImageView extends ImageView {
public AspectRatioImageView(Context context)
{
super(context);
this.setScaleType(ScaleType.FIT_XY);
}
public AspectRatioImageView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setScaleType(ScaleType.FIT_XY);
}
public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.setScaleType(ScaleType.FIT_XY);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
Drawable d = getDrawable();
if (d != null && d.getIntrinsicWidth() > 0)
{
int width = MeasureSpec.getSize(widthMeasureSpec);
if (width <= 0)
width = getLayoutParams().width;
int height = width * d.getIntrinsicHeight() / d.getIntrinsicWidth();
setMeasuredDimension(width, height);
}
else
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
теперь использовать его в XML:
<com.yourpackage.widgets.AspectRatioImageView
android:src="@drawable/yourdrawable"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>