Подтвердить что ты не робот

Позиционирование изображения внутри ImageView с максимальной шириной и максимальной шириной

У меня есть 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, если это имеет значение.

4b9b3361

Ответ 1

попробуйте это

<ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/home_icon" 
     android:scaleType="fitStart"/>

Это просто помогает мне.

Ответ 2

По умолчанию тип 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);


Чтобы выровнять выделение с помощью справа ImageView

в представлении xml:

<ImageView 
   android:scaleType="fitEnd" />

или в классе Java:

ImageView image_view = [create new ImageView or getView from xml];
image_view.setScale(ScaleType.FIT_END);

Ответ 3

Почему бы вам просто не добавить drawableLeft к вашему представлению.

Подобно этому (в вашем layout.xml): android: drawableLeft = "@drawable/yourDrawableId" -или- (в коде Java): yourView.setCompoundDrawablesWithIntrinsicBounds(yourDrawableId, 0, 0,0);

Вы можете управлять дополнением и т.д. этого рисунка внутри контейнера View (для управления настройками близкого размера).

Ответ 4

Я столкнулся с той же проблемой, и именно так я ее решил:

Я положил ImageView внутри RelativeLayout, который так же велик, как и ImageView, и установите гравитацию Relative Layout на то, что я хотел (осталось в вашем случае).

Я также устанавливаю для параметра adjustViewBounds значение true, чтобы ImageView был таким же большим, как и изображение, и располагался внутри Relative Layout.

Не очень элегантное решение, но оно работает...

Ответ 5

Try

android:gravity="left"

Гравитация - это то, как взгляд позиционирует его содержимое. Работает с TextView для текста и, возможно, ImageView для изображения.

Edit:

Попробуйте создать FrameLayout, содержащий ImageView. Установите ширину и высоту ImageView в значение "wrap_content" и установите значение силы тяжести родительского объекта влево.

В противном случае реализуйте onDraw в представлении и рисуйте изображение в любом месте, которое вы хотите.

Ответ 6

Я использую:

android:scaleType="fitCenter"

documented здесь. Удачи!

РЕДАКТИРОВАТЬ:. Я плохо знал, что вы не центрировали изображение в ImageView (в первом чтении я думал, что у вас возникли проблемы с центрированием ImageView в другом представлении). Теперь я не уверен, но вы можете смотреть ScaleType в любом случае ^ _-

Ответ 7

Что-то не так. Ваш 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, если это то, что вы хотите.