Пользовательские кнопки в Android: как получить границы / края / рамки при чтении фона из XML? - PullRequest
11 голосов
/ 26 мая 2010

Использование форм Android в xml Я определил градиент, который я использую в качестве фона для кнопки.

Это все хорошо работает, но вокруг кнопки нет края. Мне бы хотелось, чтобы она выглядела как обычная кнопка Android, но мне нужно больше гибкости для управления цветом и внешним видом.

Форма определяется следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:startColor="#FFFFFF" 
        android:endColor="#00FF00"
        android:angle="270" />
    <corners android:radius="3dp" />
    <stroke android:width="5px" color="#000000" />
</shape>

Я ожидаю, что граница будет установлена ​​в xml. Почему «инсульт» не исправит это? Инсульт, похоже, ничего не делает. Я проверил спецификацию Android Developer, но не смог найти ответ там: http://developer.android.com/guide/topics/resources/drawable-resource.html

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

Может кто-нибудь помочь, пожалуйста? Я знаю, что есть альтернатива сделать изображение с правильными краями и использовать ImageButton, но действительно должен быть способ исправить это программным путем.

Спасибо! Anna

Ответы [ 5 ]

19 голосов
/ 26 мая 2010

У меня была эта проблема некоторое время назад. Хотя я не совсем помню, почему я принимал каждое решение, я решил использовать форму списка слоев. Это позволяет вам сложить одну фигуру поверх другой. Например, следующий XML-код создает фигуру со сплошным черным контуром шириной 2 пикселя с градиентом от серого до белого к серому по центру:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <padding android:left="1dp"
                android:top="1dp"
                android:right="1dp"
                android:bottom="1dp"/>
            <solid android:color="#FF000000"/>
            <corners android:radius="3dp"/>
        </shape>
    </item>

    <item>
        <shape>
            <padding android:left="2dp"
                android:top="2dp"
                android:right="2dp"
                android:bottom="2dp"/>
            <gradient android:startColor="#FFB0B0B0"
                android:centerColor="#FFFFFFFF"
                android:endColor="#FFB0B0B0"
                android:angle="315"/>
        </shape>
    </item>
</layer-list>

Если вы хотите иметь возможность динамически изменять этот цвет во время выполнения, то все становится лот беспорядком. Опять же, детали того, почему я должен был делать что-то определенным образом, туманны, но в итоге мне пришлось создать собственный класс представления, который содержал собственный ShapeDrawable. Я начал с просмотра примеров из приложения ApiDemos, которое поставляется с SDK - это очень хороший ресурс.

РЕДАКТИРОВАТЬ: Другая причина, по которой ваш штрих может не отображаться, заключается в том, что вы забыли android: перед битом color = "....".

6 голосов
/ 20 марта 2012

У меня была та же проблема, я заметил, что штрих не применяется к кнопке в качестве границы во время разработки, но во время выполнения я вижу границу.

Я использовал следующий код

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" android:padding="10dp">
    <solid android:color="@color/black" />
    <stroke  android:width="1px" android:color="@color/red" />

</shape>

как сказал Стив Хэнли, вы пропускаете андроид : для атрибута цвета.

Надеюсь, это кому-нибудь поможет ...

3 голосов
/ 12 августа 2011

Возможно, слишком поздно, но вы должны добавить лишний ff перед цветом.

<stroke android:width="5px" color="#ff000000" />

Greets

1 голос
/ 26 января 2012

Использовать ImageButton

   <ImageButton
        android:layout_width="40dp"
        android:layout_height="30dp"
        android:src="@drawable/left_arrow"
        android:background="@drawable/button_selector"
        android:gravity="center"/>

Используйте селектор Drawable для ImageButton и определите свои свойства

<item android:state_pressed="true" >
    <shape>
        <gradient
            android:startColor="@color/startColor"
            android:endColor="@color/endColor"
            android:angle="270" />
        <stroke
            android:width="0.5dp"
            android:color="@color/borderColor" />
        <corners
            android:topLeftRadius="5dp"
            android:bottomRightRadius="5dp"/>
    </shape>
</item>

<item android:state_focused="true" >
    <shape>
        <gradient
            android:startColor="@color/startColor"
            android:endColor="@color/endColor"
            android:angle="270" />
        <stroke
            android:width="0.5dp"
            android:color="@color/borderColor" />
        <corners
            android:topLeftRadius="5dp"
            android:bottomRightRadius="5dp"/>
    </shape>
</item>

<item>        
    <shape>
        <gradient
            android:startColor="@color/startColor"
            android:endColor="@color/endColor"
            android:angle="270" />
        <stroke
            android:width="0.5dp"
            android:color="@color/borderColor" />
        <corners
            android:topLeftRadius="5dp"
            android:bottomRightRadius="5dp"/>
    </shape>
</item>    

0 голосов
/ 12 июня 2012

<item android:state_enabled="false" android:drawable="@drawable/button_disabled" />

<item android:state_focused="true" android:drawable="@drawable/button_highlighted"/>
<item android:state_pressed="true" android:drawable="@drawable/button_highlighted"/>

<item>
    <shape>
        <gradient android:startColor="#fdfdfd" android:endColor="#f0f0f0" android:angle="270" />
        <stroke android:width="1dp" android:color="#56390a" />
        <corners android:radius="3dp" />
        <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    </shape>
</item>

Добавление stroke color #56390a решит проблему.

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