2010-05-04 4 views
16

У меня есть ImageView с максимальной высотой и максимальной шириной оба установлены в 100. На приведенном ниже рисунке явно не квадрат, но вы можете использовать свое воображение;)Позиционирование изображения внутри ImageView с максимальной высотой и максимальной шириной

Рисунок 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, если это делает никакой разницы.

+8

+1 для тонкой ASCII art :-) –

ответ

1

Попробуйте

android:gravity="left" 

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

Edit:

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

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

1

Я использую:

android:scaleType="fitCenter" 

документально here. Удачи!

EDIT: Плохо, я не понимал, что вы центрируете изображение в ImageView (в первом чтении я думал, что у вас возникли проблемы с центрированием ImageView в другом представлении). Теперь я не уверен, но вы можете посмотреть на ScaleType любом случае^_-

2

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

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

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

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

3

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

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

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

+0

И где именно это работает? Автозаполнение не показывает мне «drawableLeft». Можете ли вы привести пример? –

19

попробовать это

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

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

1

Что-то не так. Ваш 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" 
    /> 

Test его с некоторыми растровыми изображениями, который имеет прозрачный цвет фона, чтобы мы могли увидеть красные фон из 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, если это то, что вы хотеть.

4

По умолчанию scaleType является «fitCenter»/ScaleType.FIT_CENTER, как в вашем первом эскизе.


Для выравнивания Drawable к покинул из 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); 
+0

Точно хороший ответ, чтобы центрировать изображение внутри ImageView, нужно больше голоса! – Pull

Смежные вопросы