Настройка источника изображения для ToggleButton - PullRequest
15 голосов
/ 23 мая 2011

У меня есть 30px x 30px png файл, который я хотел бы использовать в качестве фона android: src, а не android: background.При использовании его в качестве фона и упоминании «wrap_content» как для высоты, так и для ширины, конечный результат больше похож на 45px x 45 px.

В идеале мне нужно сочетание ImageButton и ToggleButton.,Я хотел бы иметь возможность установки Android: src ImageButton и возможность переключения, где состояния сохраняются автоматически для меня.

Любое решение или обходной путь?

TIA.

Привет, похоже, это не помогает создать другой стиль.Src по-прежнему выглядит намного больше, чем оригинал 30px x 30px.

В main.xml:

<ToggleButton android:id="@+id/blah"
    style="@style/myToggle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
</ToggleButton>

В Styles.xml

<style name="myToggle">
    <item name="android:textOn">""</item>
    <item name="android:textOff">""</item>
    <item name="android:disabledAlpha">?android:attr/disabledAlpha</item>
    <item name="android:background">@drawable/my_btn_toggle_bg</item>
</style>

В my_btn_toggle_bg.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/myBackground" android:drawable="@android:drawable/btn_default_small" />
    <item android:id="@+id/myToggle" android:drawable="@drawable/my_btn_toggle" />
</layer-list>

В my_btn_toggle.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false" android:drawable="@drawable/pausebutton" />
    <item android:state_checked="true" android:drawable="@drawable/playbutton" />
</selector>

playbutton.png и pausebutton.png имеют размер 30 х 30 х каждый.Но они выглядят намного больше, когда я вижу их на устройстве

Ответы [ 5 ]

16 голосов
/ 23 мая 2011

Вы можете сделать так, чтобы кнопка переключателя выглядела как угодно. Вам просто нужно создать стиль. Загляните в /platforms//data/res/values/styles.xml и найдите Widget.Button.ToggleButton Это выглядит так:

<style name="Widget.Button.Toggle">
    <item name="android:background">@android:drawable/btn_toggle_bg</item>
    <item name="android:textOn">@android:string/capital_on</item>
    <item name="android:textOff">@android:string/capital_off</item>
    <item name="android:disabledAlpha">?android:attr/disabledAlpha</item>
</style>

Итак, если вы найдете btn_toggle_bg drawable, вы найдете это:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+android:id/background" android:drawable="@android:drawable/btn_default_small" />
    <item android:id="@+android:id/toggle" android:drawable="@android:drawable/btn_toggle" />
</layer-list>

Что показывает, что для src он использует стандартный Button фон и отрисовку с именем btn_toggle. btn_src.xml выглядит так:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false" android:drawable="@drawable/btn_toggle_off" />
    <item android:state_checked="true" android:drawable="@drawable/btn_toggle_on" />
</selector>

Которые являются двумя объектами рисования, которые используются для отображения состояния кнопки. На самом деле они называются btn_toggle_ {on / off} .9.png, поскольку они представляют собой 9 изображений патчей, поэтому они растягиваются в соответствии с размером кнопки.

6 голосов
/ 15 февраля 2013

Я понял, как это сделать (центрируя меньшее фоновое изображение внутри большой кнопки ToggleButton), используя ScaleDrawable :

Установите для ToggleButton использование селектора Drawable, как обычно:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:variablePadding="true">
    <item android:drawable="@drawable/ic_star_selected_centered"
          android:state_checked="true" />
    <item android:drawable="@drawable/ic_star_default_white_centered"
          android:state_pressed="true" />
    <item android:drawable="@drawable/ic_star_default_black_centered" />
</selector>

Затем создайте ScaledDrawable для каждого из вышеупомянутых элементов рисования элементов, который указывает на ваш ФАКТИЧЕСКИЙ файл изображения.например, ic_star_selected_centered.xml:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_star_selected"
    android:scaleGravity="center"
    android:scaleHeight="100%"
    android:scaleWidth="100%" 
     />

Наконец, в Android есть ошибка , которая делает любые ScaledDrawables невидимыми сначала , пока вы не установите их уровень.Поэтому при надувании вашего представления вызовите setLevel () от 1 до 10000 (1 - наименьший масштаб, 10000 - в натуральную величину):

    StateListDrawable star = (StateListDrawable) myToggleButton.getBackground();
    star.setLevel(5000); // centers the image at half size. shame on Android for using magic numbers!
1 голос
/ 01 июня 2015
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <inset android:insetLeft="15dp" android:insetRight="15dp" android:insetTop="15dp" android:insetBottom="15dp">
            <bitmap android:src="@drawable/ic_star_selected_centered" />
        </inset>
    </item>

    <item android:state_pressed="true" >
        <inset android:insetLeft="15dp" android:insetRight="15dp" android:insetTop="15dp" android:insetBottom="15dp">
            <bitmap android:src=" android:src="@drawable/ic_star_default_white_centered" />
        </inset>
    </item>

    <item >
        <inset android:insetLeft="15dp" android:insetRight="15dp" android:insetTop="15dp" android:insetBottom="15dp">
            <bitmap android:src="@drawable/ic_star_default_black_centered" />
        </inset>
    </item>
</selector>
0 голосов
/ 24 мая 2011

В дополнение к тому, что должен был сказать @caseyB (посмотрите на комментарии), мне пришлось изменить тему упражнения, чтобы достичь желаемого эффекта. Я думаю, что это проблема HoneyComb Xoom и может не отображаться на телефонах. Спасибо всем за внимание к моему вопросу и помощь.

0 голосов
/ 23 мая 2011

«Быстрый и грязный» способ достижения этого состоит в том, чтобы использовать относительную компоновку и поместить ваш ImageView поверх ToggleButton.Установите android:layout_centerInParent="true" и установите прослушиватель onClick на переключатель

. Сказал, что - другое решение CaseyB (настройка фоновых файлов) - правильный подход

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