Как сохранить соотношение сторон изображения, если imageview сначала растягивается, чтобы заполнить родительский элемент


Я хочу растянуть изображение, чтобы заполнить ширину и настроить высоту в соответствии с шириной и сохранить соотношение сторон. Я хочу, чтобы он охватывал всю ширину (fillparent), а высота imageview должна регулироваться так, чтобы соотношение сторон сохранялось.

Я попробовал fit_xy, но в моем случае это не сработало. Пожалуйста, помогите мне

4 4

4 ответа:

Существует два возможных обходных пути, даже если вы задаете тип шкалы fit_xy

1) по умолчанию Android будет масштабировать изображение вниз, чтобы соответствовать ImageView, сохраняя соотношение сторон. Однако убедитесь, что вы устанавливаете изображение в ImageView, используя android:src="...", а не android:background="...". src= позволяет масштабировать изображение, сохраняя соотношение сторон, но background= позволяет масштабировать и искажать изображение, чтобы оно точно соответствовало размеру ImageView. (Вы можете использовать фон и источник в в то же время, что может быть полезно для таких вещей, как отображение рамки вокруг основного изображения, используя только один ImageView.)

2) вы также должны увидеть android:adjustViewBounds, чтобы изменить размер ImageView, чтобы соответствовать масштабируемому изображению. Например, если у вас есть прямоугольное изображение в том, что обычно является квадратным ImageView, adjustViewBounds=true заставит его изменить размер ImageView на прямоугольный. Это затем влияет на то, как другие представления располагаются вокруг ImageView.

Вы можете изменить по умолчанию масштабирование изображений выполняется с помощью параметра android:scaleType. Кстати, самый простой способ узнать, как это работает, - это просто немного поэкспериментировать самому! Просто не забудьте посмотреть на макеты в самом эмуляторе (или в реальном телефоне), так как предварительный просмотр в Eclipse обычно ошибочен.

Я не уверен, когда функция, которую я использую, была добавлена в Android SDK, но есть простое решение, которое делает именно то, что ищет OP:

Как и ожидалось, установите layout: width и layout: height в fill_parent.

Как правильно отметил другой ответчик, используйте src, чтобы найти свое изображение, а не фон.

Однако вместо того, чтобы пытаться scaleType fit_xy (который находит самую узкую сторону, чтобы вписаться в представление, а не самую длинную сторону), используйте scaleType of centerCrop.

CenterCrop центрирует и заполняет видовое окно, сохраняя при этом соотношение сторон.

Надеюсь, это поможет! Я использовал его для загрузки webView наложения коммерческого приложения, которое я разработал для моего нынешнего работодателя.

Решение для копирования / вставки: в XML-файл действия добавьте следующие строки:

<ImageView
    android:id="@+id/logo"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:scaleType="centerCrop"
    android:src="@drawable/your_image_name"
    />

Есть два способа сделать это: Сначала найдите высоту и ширину дисплея и вызовите этот метод

private void scaleImage(int displayWidth) {

    // Get the ImageView and its bitmap

             width=displayWidth;
    Drawable drawing = holder.imagepost.getDrawable();

    {
        Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap();


        int bounding = dpToPx(width);

        // Determine how much to scale: the dimension requiring less
        // scaling is
        // closer to the its side. This way the image always stays
        // inside your
        // bounding box AND either x/y axis touches it.
        float xScale = ((float) bounding) / width;
        float yScale = ((float) bounding) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        // Create a matrix for the scaling and add the scaling data
        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        // Create a new bitmap and convert it to a format understood by
        // the ImageView
        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width,
                height, matrix, true);
        width = scaledBitmap.getWidth(); // re-use
        height = scaledBitmap.getHeight(); // re-use
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);

        // Apply the scaled bitmap
        holder.imagepost.setImageDrawable(result);

        // Now change ImageView's dimensions to match the scaled image
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.imagepost
                .getLayoutParams();
        params.width = width;
        params.height = height;
        holder.imagepost.setLayoutParams(params);

    }

}

private int dpToPx(int dp) {
    float density = context.getResources().getDisplayMetrics().density;
    return Math.round((float) dp * density);
}

Или лучший способ, который я знаю, это использовать Android Query

Вот ссылка http://code.google.com/p/android-query/ и вы можете скачать оттуда себя.Ниже id код для поддержания соотношения сторон

aq.id(R.id.imageView)

                .image(imageString, true, true,
                        displaywidth, 0, null, AQuery.FADE_IN, AQuery.RATIO_PRESERVE);

Ниже Решение работает нормально для меня.

Используйте опцию AQuery Libray " Аквери.RATIO_PRESERVE " для сохранения соотношения сторон:

aq.id(R.id.imgView).progress(R.id.imgPb).image(url, true, true,150, 0,null,AQuery.FADE_IN,AQuery.RATIO_PRESERVE);

Используйте следующие настройки для ImageView:

<ImageView
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:scaleType="fitXY"/>

Используйте следующие настройки для столбцов auto GridView:

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/gridView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:numColumns="auto_fit"
 android:columnWidth="150dp"/>