Настройка источника изображения для ToggleButton

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

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

Любое решение или обходное решение?

ТИА.

Привет, Это не похоже на создание другого стиля. 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 - 30px x 30px каждый. Но они кажутся намного большими, когда я вижу, что он выложен на устройстве.

Ответ 1

Вы можете заставить кнопку переключения выглядеть так, как хотите. Вам просто нужно создать стиль. Посмотрите в /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>

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

Ответ 2

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

Ответ 3

<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>

Ответ 4

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

Ответ 5

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

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