Размещение изображения внутри ImageView с установленными максимальной высотой и максимальной шириной - PullRequest
16 голосов
/ 04 мая 2010

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

Ответы [ 7 ]

19 голосов
/ 09 октября 2011

попробуйте

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

Мне это просто помогает.

5 голосов
/ 04 октября 2012

По умолчанию типом 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 голосов
/ 12 сентября 2011

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

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

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

2 голосов
/ 06 июня 2011

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

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

Я также установил AdjustViewBounds в true, чтобы ImageView был таким же большим, как и Image, и расположен внутри Относительного макета.

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

1 голос
/ 05 ноября 2011

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

1 голос
/ 04 мая 2010

Я использую:

android:scaleType="fitCenter"

задокументировано здесь . Удачи!

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

1 голос
/ 04 мая 2010

Попробуйте

android:gravity="left"

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

Edit:

Попробуйте создать FrameLayout, который содержит ImageView. Установите ширину и высоту ImageView на «wrap_content» и установите гравитацию родителя на «left».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...