Как сохранить соотношение сторон изображения, если imageview сначала растягивается, чтобы заполнить родительский элемент
Я хочу растянуть изображение, чтобы заполнить ширину и настроить высоту в соответствии с шириной и сохранить соотношение сторон. Я хочу, чтобы он охватывал всю ширину (fillparent), а высота imageview должна регулироваться так, чтобы соотношение сторон сохранялось.
Я попробовал fit_xy, но в моем случае это не сработало. Пожалуйста, помогите мне
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"/>