Ответ 1
попробуйте это
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/home_icon"
android:scaleType="fitStart"/>
Это просто помогает мне.
У меня есть ImageView
с максимальной высотой и максимальной шириной, которые установлены на 100
. На рисунке ниже явно не квадрат, но вы можете использовать свое воображение;)
Рисунок 1:
╔══════════════════════════════════════════════╗
║ ImageView ╔══════════════╗ ║
║ ║ ║ ║
║ ║ Actual image ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ╚══════════════╝ ║
╚══════════════════════════════════════════════╝
В любом случае, если я попытаюсь установить BitMap
в ImageView
, который не имеет отношения 1:1, изображение будет располагаться так, как показано на рисунке 1. Я хочу, чтобы изображение было помещено слева внутри ImageView
, как показано на рисунке 2 ниже.
Рисунок 2:
╔══════════════════════════════════════════════╗
║══════════════╗ ║
║ ║ ║
║ Actual image ║ ║
║ ║ ║
║ ║ ║
║ ║ ║
║══════════════╝ ║
╚══════════════════════════════════════════════╝
Вы можете увидеть мой ImageView в XML ниже. maxHeight
, maxWidth
и adjustViewBounds
устанавливаются во время выполнения.
<ImageView android:id="@+id/someImage"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textName"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingRight="4dp"
/>
Это в RelativeLayout
, если это имеет значение.
попробуйте это
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/home_icon"
android:scaleType="fitStart"/>
Это просто помогает мне.
По умолчанию тип scaleType - "fitCenter" /ScaleType.FIT_CENTER, как в вашем первом эскизе.
Чтобы выровнять выделение с левой ImageView, как показано на втором эскизе:
в представлении xml:
<ImageView
android:scaleType="fitStart" />
или в классе Java:
ImageView image_view = [create new ImageView or getView from xml];
image_view.setScale(ScaleType.FIT_START);
в представлении xml:
<ImageView
android:scaleType="fitEnd" />
или в классе Java:
ImageView image_view = [create new ImageView or getView from xml];
image_view.setScale(ScaleType.FIT_END);
Почему бы вам просто не добавить drawableLeft к вашему представлению.
Подобно этому (в вашем layout.xml): android: drawableLeft = "@drawable/yourDrawableId" -или- (в коде Java): yourView.setCompoundDrawablesWithIntrinsicBounds(yourDrawableId, 0, 0,0);
Вы можете управлять дополнением и т.д. этого рисунка внутри контейнера View (для управления настройками близкого размера).
Я столкнулся с той же проблемой, и именно так я ее решил:
Я положил ImageView внутри RelativeLayout, который так же велик, как и ImageView, и установите гравитацию Relative Layout на то, что я хотел (осталось в вашем случае).
Я также устанавливаю для параметра adjustViewBounds значение true, чтобы ImageView был таким же большим, как и изображение, и располагался внутри Relative Layout.
Не очень элегантное решение, но оно работает...
Try
android:gravity="left"
Гравитация - это то, как взгляд позиционирует его содержимое. Работает с TextView для текста и, возможно, ImageView для изображения.
Edit:
Попробуйте создать FrameLayout, содержащий ImageView. Установите ширину и высоту ImageView в значение "wrap_content" и установите значение силы тяжести родительского объекта влево.
В противном случае реализуйте onDraw в представлении и рисуйте изображение в любом месте, которое вы хотите.
Я использую:
android:scaleType="fitCenter"
documented здесь. Удачи!
РЕДАКТИРОВАТЬ:. Я плохо знал, что вы не центрировали изображение в ImageView (в первом чтении я думал, что у вас возникли проблемы с центрированием ImageView в другом представлении). Теперь я не уверен, но вы можете смотреть ScaleType в любом случае ^ _-
Что-то не так. Ваш ImageView определен с wrap_content
для его layout_width
и layout_height
в XML, поэтому он должен всегда занимать только то же пространство, что и ваше растровое изображение.
Попробуйте добавить android:background
для вашего ImageView, чтобы увидеть, что он действительно шире вашего растрового изображения и вызвал нежелательное центрирование:
<ImageView android:id="@+id/someImage"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textName"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingRight="4dp"
android:background="#F00"
/>
Протестируйте его с помощью некоторых растровых изображений, которые имеют прозрачный цвет фона, чтобы мы могли видеть красный фон из ImageView. Я ожидаю, что он покажет высокий прямоугольник, если растровое изображение источника будет высоким и большим прямоугольником, если растровое изображение будет широким. Вы увидите только квадрат, если ваш исходный растровый рисунок квадратный. Мы никогда не должны видеть пример с рисунком 1 из вашего вопроса.
Возможно, вы хотели, чтобы ваш ImageView всегда имел размер 100x100 во все времена? Затем вы можете использовать следующий код (обратите внимание на fitStart
для атрибута scaleType
, как уже упоминалось ранее):
<ImageView android:id="@+id/someImage"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textName"
android:layout_width="100dp"
android:layout_height="100dp"
android:paddingRight="4dp"
android:background="#F00"
android:scaleType="fitStart"
/>
Нет необходимости устанавливать maxHeight
, maxWidth
и adjustViewBounds
из кода Java, если это то, что вы хотите.