Intereting Posts
Слияние или Rebase или Branch Default В Android Studio? В чем отличия? Genymotion как отлаживать с помощью Chrome Dev Tools Как программно отключить WiFi на Android-устройстве? Что происходит с выполнением JavaScript (settimeout и т. Д.), Когда iPhone / Android ложится спать? Фрагмент входа в Facebook закрывает приложение, используя Facebook SDK 3.0.1 Как удалить модуль в Android Studio Выберите несколько изображений из фотоальбома на Android с помощью намерений Объявить конечную переменную, но установить позже Как сделать телефонный звонок, используя намерение в Android? Android – Как отобразить диалог по собственному экрану? Создание наблюдаемого без использования Observable.create Ошибка выполнения команды 'ant' в Mac OS X 10.9 Mavericks при создании Android с помощью PhoneGap / Cordova Ошибка в приложении Phonegap: не установленный модуль cordova / plugin_list уже определен Недоступен DialogStyle WebView, добавьте локальный файл .CSS на HTML-страницу?

ImageView adjustViewBounds не работает

У меня есть ImageView с android:layout_width=100dp , android:layout_height=wrap_content и android:adjustViewBounds=true

Это источник 50 х 50 пикселей. Но соотношение сторон не сохраняется – высота ImageView составляет 50 пикселей, а не 100 пикселей (т.е. adjustViewBounds не работает). Если у меня есть изображение размером 200×200 пикселей, оно работает – ширина и высота – 100 пикселей. Этот код дает изображение шириной 100 пикселей и размером 50 пикселей, но изображение src равно квадрату:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/photo" android:src="@drawable/icon" android:layout_width="100dp" android:layout_height="wrap_content" android:scaleType="fitXY" android:adjustViewBounds="true" /> </LinearLayout> 

Solutions Collecting From Web of "ImageView adjustViewBounds не работает"

Проблема в том, что adjustViewBounds не будет увеличивать размер ImageView за пределами естественных размеров извлекаемого. Он будет только уменьшать представление для поддержания соотношения сторон; Если вы предоставили изображение размером 500×500 вместо изображения 50×50, это должно сработать.

Если вас интересует то место, где это поведение реализовано, см . Реализацию onMeasure в ImageView.java .

Одним из способов решения является создание пользовательского ImageView который изменяет это поведение в onMeasure .

Это более простой способ. Сделайте свой ImageView следующим:

 <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitCenter" android:adjustViewBounds="true"/> 

Этот способ рисования растягивается, чтобы соответствовать центру ImageView , сохраняя соотношение сторон. Нам просто нужно вычислить правильную высоту, чтобы сделать ее пропорциональной, чтобы у нас не было свободного пространства:

 private void setImageBitmap(Bitmap bitmap, ImageView imageView){ float i = ((float)imageWidth)/((float)bitmap.getWidth()); float imageHeight = i * (bitmap.getHeight()); imageView.setLayoutParams(new RelativeLayout.LayoutParams(imageWidth, (int) imageHeight)); imageView.setImageBitmap(bitmap); } 

У меня было аналогичное требование; В моем случае я хотел, чтобы изображение было квадратным, и хотел, чтобы ImageView соответствовал соотношению сторон, поэтому я мог использовать его фон и дополнение для рисования границы.

Я прочитал ответы здесь, но вместо того, чтобы переопределять ImageView, я решил создать макет, который гарантирует, что его содержимое (должно быть только одно представление) является квадратным. Таким образом, я мог бы использовать стандартный ImageView внутри него. (И вы никогда не знаете, я мог бы захотеть сделать что-то еще квадратное позже. Хотя, вероятно, нет.)

В случае, если это полезно для других, вот код (не стесняйтесь копировать). Вероятно, есть ошибки, поскольку я только что сделал это для моего приложения, а затем остановился. 🙂

 public class SquareLayout extends ViewGroup { public SquareLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public SquareLayout(Context context, AttributeSet attrs) { super(context, attrs); } public SquareLayout(Context context) { super(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // Work out width and height, and square size. int width = r - l; int height = b - t; int size, xOffset, yOffset; if(width < height) { size = width; xOffset = 0; yOffset = (height - size) / 2; } else { size = height; xOffset = (width - size) / 2; yOffset = 0; } for(int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); child.layout(xOffset, yOffset, size + xOffset, size + yOffset); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Get width and height. int w = -1, h = -1; switch(MeasureSpec.getMode(widthMeasureSpec)) { case MeasureSpec.AT_MOST: case MeasureSpec.EXACTLY: w = MeasureSpec.getSize(widthMeasureSpec); break; case MeasureSpec.UNSPECIFIED: break; } switch(MeasureSpec.getMode(heightMeasureSpec)) { case MeasureSpec.AT_MOST: case MeasureSpec.EXACTLY: h = MeasureSpec.getSize(heightMeasureSpec); break; case MeasureSpec.UNSPECIFIED: break; } // If only one of width/height is unspecified, set them both the same. if(w == -1 && h != -1) { w = h; } else if(h == -1 && w != -1) { h = w; } // Either they're both specified or both unspecified. int childMeasureSpec; if(w == -1) { childMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } else { childMeasureSpec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY); } // Pass through to children. int maxDimension = 1; for(int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); child.measure(childMeasureSpec, childMeasureSpec); maxDimension = Math.max(maxDimension, child.getMeasuredWidth()); maxDimension = Math.max(maxDimension, child.getMeasuredHeight()); } if(w == -1) { w = maxDimension; h = maxDimension; } setMeasuredDimension(w, h); } } 

В дополнение к ответу @ RomanNurik

Здесь вы можете найти рабочее решение, либо скопировать-вставить код, либо просто добавить зависимость Gradle

 dependencies { compile 'com.inthecheesefactory.thecheeselibrary:adjustable-imageview:1.0.1' } 

PS Решение, предоставленное компанией @Nilzor, не помогло мне