Как масштабировать изображение до максимального размера в диалоговом стиле - PullRequest
0 голосов
/ 25 ноября 2010

У меня есть активность, которая использует android:theme="@android:style/Theme.Dialog".Действие содержит ImageView, который может отображать изображения разных размеров.ImageView должен масштабировать изображение так, чтобы оно полностью вписывалось в окно, по крайней мере, по осям полностью и сохранялось исходное соотношение сторон.Размер диалога должен быть таким же большим, как ImageView (плюс ширина его границы).

Я пробовал следующее, но диалоговое окно всегда использует все доступное пространство:

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/imageParent"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dip">
    <ProgressBar
        android:id="@android:id/progress"
        android:layout_width="40dip"
        android:layout_height="40dip"
        android:layout_centerInParent="true"
        android:visibility="gone"
        style="@android:attr/progressBarStyleSmallTitle"/>
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:id="@+id/image"/>
</RelativeLayout>

1 Ответ

1 голос
/ 25 ноября 2010

Я нашел решение самостоятельно, но я не совсем уверен, что оно правильно в любой ситуации.Я создал подкласс ImageView (CustomImageView) и определил метод onMeasure () следующим образом:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    Drawable drawable = getDrawable();
    if (drawable != null) {
        int measureHeight = View.MeasureSpec.getSize(heightMeasureSpec);
        int measureWidth = View.MeasureSpec.getSize(widthMeasureSpec);

        int resultWidth = measureWidth;
        float scaleFactor = (float)resultWidth / drawable.getMinimumWidth();
        int resultHeight = (int)(scaleFactor * drawable.getMinimumHeight());

        if (resultHeight > measureHeight) {
            resultHeight = measureHeight;
            scaleFactor = (float)resultHeight / drawable.getMinimumHeight();
            resultWidth = (int)(scaleFactor * drawable.getMinimumWidth());
        }

        setMeasuredDimension(resultWidth, resultHeight);
    } else {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}

Мой макет теперь выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/imageParent"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dip">
    <ProgressBar
        android:id="@android:id/progress"
        android:layout_width="40dip"
        android:layout_height="40dip"
        android:layout_centerInParent="true"
        style="@android:attr/progressBarStyleSmallTitle"
        android:visibility="gone"/>
    <com.example.CustomImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:id="@+id/image"/>
</RelativeLayout>
...