На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
  
> Пропорциоанальное масштабирование ImageButton в процентах от ширины экрана
    Привет андроидерам!

    Надеюсь, из названия темы ясна моя проблема. Все в том же приложение хочу повесть диалог для выбора времени исполнения заказа такси (время поездки или другой услуги) на ImageButton. Это уже нормально работает. Но шеф хочет, чтобы кнопка масштабировалась пропорционально и по ширине, и по высоте в зависимости от ширины экрана. То есть чтобы нормально выглядела и на обычном смартфоне, не и на планшете не терялась, а соответственно увеличивалась. Сохранил картинку с расширением .9.png, чтобы сигнализировать, что она масштабируемая. По ширине масштабировать получается с помощью весов, а по высоте - нет. Либо она непропорционально растягивается, если я задаю фикисрованную высоту, либо масштабируется вроде пропорционально, но либо обрезается на фиксированной высоте, либо пытается в нее влезть за счет того, что сокращается по ширине. Что-то мне не найти решение этой проблемы самому. Видел только с помощью кода, где для картинки задавалась такая же высота, как и расчитанная андроидом на основании весов ширина. Но мне так не хочется, я не теряю надежды, что этот вопрос можно решить сугубо с помощью разметки. Подскажет кто-нибудь?
      Цитата Homez @
      По ширине масштабировать получается с помощью весов, а по высоте - нет.

      Как это? Всё можно. Вот как раз недавно решал такую же задачу. Главное линт не слушай, он про nested weight гонит.
        Цитата Homez @
        По ширине масштабировать получается с помощью весов, а по высоте - нет.

        Здест фраза "с помощью весов" относится не ко всему предложению, а только к левой его части, до запятой:) Для ясности повторю: мне нужно, чтобы размер картинки определялся в процентах от ширины экрана, при это чтобы высота масштабировалась соответственно, сохраняя пропорции.

        Цитата Сэргэй Кляуз @
        Всё можно. Вот как раз недавно решал такую же задачу.

        И как?

        Цитата Сэргэй Кляуз @
        Главное линт не слушай, он про nested weight гонит.

        Я и не знаю, кто такой линт.

        Добавлено
        P.S. Где-то еще видел, что подобная проблема была решена с помощью наследования от стандартного виджета с переопределением только одного метода (ну и конструкторы, разумеется). Типа SquareImageButton там было. Но мне подобное делать не хочется, не желаю перегружать свой проект программными костылями и прочим кодом, без которого можно обойтись, грамотно написав layout. Вот только сегодня узнал про свойтсво hint. А до этого уже успел написать код, который делает ровно то же самое. Теперь эти 40-50 строчек кода можно смело вырезать, перейдя на этот hint и textColorHint.
          Цитата Homez @
          И как?

          Ну вот как то так:

          ExpandedWrap disabled
            <?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
            Цитата Сэргэй Кляуз @
            <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. А зачем эта ссылка в конце?
              А ссылка в конце на линт. Да, ты обрати внимание, что внешний лейаут у меня распределяет веса по высоте, а внутренний - по ширине.
                Цитата Сэргэй Кляуз @
                Да, ты обрати внимание, что внешний лейаут у меня распределяет веса по высоте, а внутренний - по ширине.

                Мне по высоте и не нужно.
                  Цитата Homez @
                  Мне по высоте и не нужно.


                  Цитата Homez @
                  Но шеф хочет, чтобы кнопка масштабировалась пропорционально и по ширине, и по высоте в зависимости от ширины экрана.


                  :wacko:
                    А чего непонятного? У меня размеры обычных текстовых кнопок выставляются в 80% от ширины экрана с помощью весов. А высота у них постоянная. Но для ImageButton так не прокатит - там реальная картинка, часы-будильник. Соответственно, вместе с шириной должна масштабироваться и высота.

                    А весов по вертикали у меня нет, главный виджет - ScrollView, или как там его, если по высоте все виджеты не влезают, то можно прокрутить.
                      Цитата Homez @
                      Но для ImageButton так не прокатит - там реальная картинка, часы-будильник. Соответственно, вместе с шириной должна масштабироваться и высота.

                      Еще раз: у тебя не правильный лейаут сверстан. Давай выкидай всё лишнее, замени все элементы на кнопки, оставь имейдж батто - и выкладывай сюда, будем смотреть. Бо лейауты - штука тонкая, по описанию не расскажешь.
                        Откуда такое мнение, что лэйаут неправильный? Я его даже сюда не выкладывал. Он неправильный только в том смысле, что вот ImageButton масштабируется неправильно. Ну собственно, там пока и стоит фиксированная ширина и высота, то есть, по размеру картинки.

                        Сейчас чаю попью и буду пробовать, если не получится, то выложу сюда. Но думаю, что весь выкладывать смысла никакого нет - все не относящееся к делу будет только отвлекать.
                        Сообщение отредактировано: Homez -
                          Цитата Homez @
                          Он неправильный только в том смысле, что вот ImageButton масштабируется неправильно.

                          От тоска-печаль :( Если что то не так на лейауте, то он - неправильный. И возможно надо будет переделать ВСЁ.

                          Цитата Homez @
                          Но думаю, что весь выкладывать смысла никакого нет - все не относящееся к делу будет только отвлекать.

                          Вот поэтому я и говорю - замени все элементы тупо на кнопки
                            Цитата Сэргэй Кляуз @
                            И возможно надо будет переделать ВСЁ.

                            Сильно сомневаюсь. Все остальное устраивает вполне.

                            Вот пример лэйаута:

                            ExpandedWrap disabled
                              <?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>


                            Итак, тут жестко задана высота кнопки, а хочется, чтобы она андроидом ставилась автоматически. Есть ли такая возможность без привлечения программного кода?
                              Homez, вот сразу расскажи мне:
                              1) Зачем в одном линеар лейауте второй?
                              2) Зачем 2 пустые вьюхт? Юзай марджини или паддинги
                                Гм, а как маржин задавать в процентах от ширины экрана? Я что-то упустил?:)

                                Тут же фишка в том, что надо вывести этот ImageButton на отдельной строке по центру, и он должен масштабироваться в зависимости от размера (ширины) экрана.
                                  Цитата Homez @
                                  Тут же фишка в том, что надо вывести этот ImageButton на отдельной строке по центру, и он должен масштабироваться в зависимости от размера (ширины) экрана.

                                  Ну так поставь гравити - центр, а потом весом отмасштабируй.
                                    А по высоте как? Если ты предлагаешь маржином или паддингом делать отступы от краев, то как их масштабировать? Чтобы картинка, допустим, по ширине растягивалась на 30% от ширины экрана и пропорционально растягивалась/сжималась по высоте?

                                    Добавлено
                                    По ширине получается, а по высоте - никак.
                                      ExpandedWrap disabled
                                        <?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 - это то что тебе надо. Далее играешся весом этой кнопки для растягивания по ширине или же весом внутреннего лейаута для высоты.
                                        Не очень-то работает. Тут вовлекаются веса внешних по отношению у нужной строке виджетов. Соответственно, нужно высчитывать их для всей формы. Это ни в коем случае мне не подойдет, так как форма динамическая, в зависимости от выбранных пользователем опций на ней могут показываться дополнительные компоненты, делая свой вклад в высоту.

                                        Добавлено
                                        Гм, шеф посмотрел текущий вариант с картинкой фиксированного размера на планшете и решил, что и не надо масштабировать этот ImageButton. Так что вопрос как бы уже не актуален. Однако, если существует нормальное решение этой проблемы, буду рад его увидеть, поэтому тему не закрываю - может пригодиться в дальнейшем.
                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                        0 пользователей:


                                        Рейтинг@Mail.ru
                                        [ Script execution time: 0,0469 ]   [ 15 queries used ]   [ Generated: 3.05.24, 18:12 GMT ]