Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.216.248] |
|
Сообщ.
#1
,
|
|
|
Привет андроидерам!
Надеюсь, из названия темы ясна моя проблема. Все в том же приложение хочу повесть диалог для выбора времени исполнения заказа такси (время поездки или другой услуги) на ImageButton. Это уже нормально работает. Но шеф хочет, чтобы кнопка масштабировалась пропорционально и по ширине, и по высоте в зависимости от ширины экрана. То есть чтобы нормально выглядела и на обычном смартфоне, не и на планшете не терялась, а соответственно увеличивалась. Сохранил картинку с расширением .9.png, чтобы сигнализировать, что она масштабируемая. По ширине масштабировать получается с помощью весов, а по высоте - нет. Либо она непропорционально растягивается, если я задаю фикисрованную высоту, либо масштабируется вроде пропорционально, но либо обрезается на фиксированной высоте, либо пытается в нее влезть за счет того, что сокращается по ширине. Что-то мне не найти решение этой проблемы самому. Видел только с помощью кода, где для картинки задавалась такая же высота, как и расчитанная андроидом на основании весов ширина. Но мне так не хочется, я не теряю надежды, что этот вопрос можно решить сугубо с помощью разметки. Подскажет кто-нибудь? |
Сообщ.
#2
,
|
|
|
Цитата Homez @ По ширине масштабировать получается с помощью весов, а по высоте - нет. Как это? Всё можно. Вот как раз недавно решал такую же задачу. Главное линт не слушай, он про nested weight гонит. |
Сообщ.
#3
,
|
|
|
Цитата Homez @ По ширине масштабировать получается с помощью весов, а по высоте - нет. Здест фраза "с помощью весов" относится не ко всему предложению, а только к левой его части, до запятой:) Для ясности повторю: мне нужно, чтобы размер картинки определялся в процентах от ширины экрана, при это чтобы высота масштабировалась соответственно, сохраняя пропорции. Цитата Сэргэй Кляуз @ Всё можно. Вот как раз недавно решал такую же задачу. И как? Цитата Сэргэй Кляуз @ Главное линт не слушай, он про nested weight гонит. Я и не знаю, кто такой линт. Добавлено P.S. Где-то еще видел, что подобная проблема была решена с помощью наследования от стандартного виджета с переопределением только одного метода (ну и конструкторы, разумеется). Типа SquareImageButton там было. Но мне подобное делать не хочется, не желаю перегружать свой проект программными костылями и прочим кодом, без которого можно обойтись, грамотно написав layout. Вот только сегодня узнал про свойтсво hint. А до этого уже успел написать код, который делает ровно то же самое. Теперь эти 40-50 строчек кода можно смело вырезать, перейдя на этот hint и textColorHint. |
Сообщ.
#4
,
|
|
|
Цитата Homez @ И как? Ну вот как то так: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="0.1" > <Button android:id="@+id/pnvLeft" android:layout_width="100dip" android:layout_height="fill_parent" android:layout_alignParentLeft="true" /> <Button android:id="@+id/pnvRight" android:layout_width="100dip" android:layout_height="fill_parent" android:layout_alignParentRight="true" /> <Button android:id="@+id/bidViewLeft" android:layout_width="100dip" android:layout_height="fill_parent" android:layout_toRightOf="@+id/pnvLeft" /> <Button android:id="@+id/bidViewRight" android:layout_width="100dip" android:layout_height="fill_parent" android:layout_toLeftOf="@+id/pnvRight" /> <ProgressBar style="?android:attr/android:progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressLeft" android:layout_toRightOf="@+id/bidViewLeft" /> <ProgressBar style="?android:attr/android:progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressRight" android:layout_toLeftOf="@+id/bidViewRight" /> </RelativeLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="0.65" android:orientation="horizontal" > <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight=".6" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight=".4" android:orientation="vertical" > <Button android:layout_width="fill_parent" android:layout_height="0dip" android:layout_gravity="top" android:layout_weight="1" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="bottom" > <Button android:id="@+id/pnvBottom" android:layout_width="100dip" android:layout_height="fill_parent" /> <Button android:id="@+id/bidViewBottom" android:layout_width="100dip" android:layout_height="fill_parent" /> </LinearLayout> </LinearLayout> <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight=".6" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="0.25" android:orientation="horizontal" > <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.75" /> <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.25" /> </LinearLayout> </LinearLayout> Добавлено http://tools.android.com/tips/lint |
Сообщ.
#5
,
|
|
|
Цитата Сэргэй Кляуз @ <LinearLayout android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="0.25" android:orientation="horizontal" > <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.75" /> <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.25" /> </LinearLayout> Полагаю, это? Гм, мне какзалось, что если у виджета стоит fill_parent и по ширине, и по высоте, то он все заполняет, не взирая на веса. Но может, я просто не пробовал так выставлять для двух виджетов. Полагаю, так как мне нужно кнопку иметь по центру по горизонтали, нужно поставть по одному View с нужными весами по бокам. Попробую завтра. P.S. А зачем эта ссылка в конце? |
Сообщ.
#6
,
|
|
|
А ссылка в конце на линт. Да, ты обрати внимание, что внешний лейаут у меня распределяет веса по высоте, а внутренний - по ширине.
|
Сообщ.
#7
,
|
|
|
Цитата Сэргэй Кляуз @ Да, ты обрати внимание, что внешний лейаут у меня распределяет веса по высоте, а внутренний - по ширине. Мне по высоте и не нужно. |
Сообщ.
#8
,
|
|
|
Цитата Homez @ Мне по высоте и не нужно. Цитата Homez @ Но шеф хочет, чтобы кнопка масштабировалась пропорционально и по ширине, и по высоте в зависимости от ширины экрана. |
Сообщ.
#9
,
|
|
|
А чего непонятного? У меня размеры обычных текстовых кнопок выставляются в 80% от ширины экрана с помощью весов. А высота у них постоянная. Но для ImageButton так не прокатит - там реальная картинка, часы-будильник. Соответственно, вместе с шириной должна масштабироваться и высота.
А весов по вертикали у меня нет, главный виджет - ScrollView, или как там его, если по высоте все виджеты не влезают, то можно прокрутить. |
Сообщ.
#10
,
|
|
|
Цитата Homez @ Но для ImageButton так не прокатит - там реальная картинка, часы-будильник. Соответственно, вместе с шириной должна масштабироваться и высота. Еще раз: у тебя не правильный лейаут сверстан. Давай выкидай всё лишнее, замени все элементы на кнопки, оставь имейдж батто - и выкладывай сюда, будем смотреть. Бо лейауты - штука тонкая, по описанию не расскажешь. |
Сообщ.
#11
,
|
|
|
Откуда такое мнение, что лэйаут неправильный? Я его даже сюда не выкладывал. Он неправильный только в том смысле, что вот ImageButton масштабируется неправильно. Ну собственно, там пока и стоит фиксированная ширина и высота, то есть, по размеру картинки.
Сейчас чаю попью и буду пробовать, если не получится, то выложу сюда. Но думаю, что весь выкладывать смысла никакого нет - все не относящееся к делу будет только отвлекать. |
Сообщ.
#12
,
|
|
|
Цитата Homez @ Он неправильный только в том смысле, что вот ImageButton масштабируется неправильно. От тоска-печаль Если что то не так на лейауте, то он - неправильный. И возможно надо будет переделать ВСЁ. Цитата Homez @ Но думаю, что весь выкладывать смысла никакого нет - все не относящееся к делу будет только отвлекать. Вот поэтому я и говорю - замени все элементы тупо на кнопки |
Сообщ.
#13
,
|
|
|
Цитата Сэргэй Кляуз @ И возможно надо будет переделать ВСЁ. Сильно сомневаюсь. Все остальное устраивает вполне. Вот пример лэйаута: <?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" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="2"/> <ImageButton android:layout_width="wrap_content" android:layout_height="200dp" android:layout_weight="4" android:src="@drawable/alarm" android:scaleType="fitStart" /> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2"/> </LinearLayout> </LinearLayout> Итак, тут жестко задана высота кнопки, а хочется, чтобы она андроидом ставилась автоматически. Есть ли такая возможность без привлечения программного кода? |
Сообщ.
#14
,
|
|
|
Homez, вот сразу расскажи мне:
1) Зачем в одном линеар лейауте второй? 2) Зачем 2 пустые вьюхт? Юзай марджини или паддинги |
Сообщ.
#15
,
|
|
|
Гм, а как маржин задавать в процентах от ширины экрана? Я что-то упустил?
Тут же фишка в том, что надо вывести этот ImageButton на отдельной строке по центру, и он должен масштабироваться в зависимости от размера (ширины) экрана. |
Сообщ.
#16
,
|
|
|
Цитата Homez @ Тут же фишка в том, что надо вывести этот ImageButton на отдельной строке по центру, и он должен масштабироваться в зависимости от размера (ширины) экрана. Ну так поставь гравити - центр, а потом весом отмасштабируй. |
Сообщ.
#17
,
|
|
|
А по высоте как? Если ты предлагаешь маржином или паддингом делать отступы от краев, то как их масштабировать? Чтобы картинка, допустим, по ширине растягивалась на 30% от ширины экрана и пропорционально растягивалась/сжималась по высоте?
Добавлено По ширине получается, а по высоте - никак. |
Сообщ.
#18
,
|
|
|
<?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" android:orientation="vertical" > <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight=".2" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight=".15" android:orientation="horizontal" > <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:layout_weight="0.3" /> <Button android:id="@+id/yourbutton" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:layout_weight="0.2" /> <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:layout_weight="0.3" /> </LinearLayout> <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight=".2" /> </LinearLayout> Единственная кнопка с id - это то что тебе надо. Далее играешся весом этой кнопки для растягивания по ширине или же весом внутреннего лейаута для высоты. |
Сообщ.
#19
,
|
|
|
Не очень-то работает. Тут вовлекаются веса внешних по отношению у нужной строке виджетов. Соответственно, нужно высчитывать их для всей формы. Это ни в коем случае мне не подойдет, так как форма динамическая, в зависимости от выбранных пользователем опций на ней могут показываться дополнительные компоненты, делая свой вклад в высоту.
Добавлено Гм, шеф посмотрел текущий вариант с картинкой фиксированного размера на планшете и решил, что и не надо масштабировать этот ImageButton. Так что вопрос как бы уже не актуален. Однако, если существует нормальное решение этой проблемы, буду рад его увидеть, поэтому тему не закрываю - может пригодиться в дальнейшем. |