Добавляйте закругленные углы, когда у вас есть android: drawableLeft with png - PullRequest
0 голосов
/ 06 марта 2019

Короче говоря, это то, что я хотел бы добавить пользовательскую кнопку, которая выглядит следующим образом:

Button_On

IMG - это файл .png в моих папках mipmap, а SOME TEXT - просто строковое значение. То, что пунктирная линия добавляется просто как разделитель на изображении, а не на кнопку. Проблема в том, что скругленные края не появляются там, где добавлено изображение. Это выглядит так:

Button_have

Мои вопросы следующие:

  1. Можно ли этого достичь?
  2. Есть ли способ переопределить атрибут <solid /> в <shape />? Мне нужно будет создать 10 из этих кнопок с разными цветами, и если я добавлю android:color с другим значением, цвет не изменится
  3. При добавлении изображения я выбираю только одно (например, mdpi). Если это будет отображаться на больших экранах, будет ли другое изображение .png в зависимости от размера?
  4. Есть ли определенный тип кнопок, которые мне следует использовать? Я хотел бы изменить цвета при нажатии кнопки и оставаться в нажатом состоянии. У меня есть смутное представление о том, как этого можно достичь, но есть ли способ сделать это и для файлов .png или мне нужно импортировать в проект другие цвета с уже инвертированными цветами и просто переключить их?

custom_button.xml

<shape 
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<corners
    android:topLeftRadius="250px"
    android:bottomLeftRadius="250px"
    android:topRightRadius="50px"
    android:bottomRightRadius="50px" />
<solid
    android:color="@color/YellowPrimary"/>
</shape>

button_styles.xml

<resources>

<style name="CategoryToggle">
    <item name="android:background">@drawable/custom_button</item>
    <item name="android:textAllCaps">true</item>
</style>

<style name="CategoryToggle.First">
    <item name="android:color">@color/bluePrimary</item> // Does not override <solid>
    <item name="android:drawableLeft">@mipmap/icon_48mdpi</item>
    <item name="android:text">@string/first_cat</item>
</style>
</resources>

button_layout.xml

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
    style="@style/CategoryToggle.History"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent" />


</android.support.constraint.ConstraintLayout>

На данный момент у меня нет кода Java, поскольку я только начал и пытался реализовать этот странный формат кнопок.

Вот так выглядит мой конец: my_end

Ответы [ 3 ]

1 голос
/ 06 марта 2019
  1. Абсолютно.Как я уже упоминал в комментариях, либо убедитесь, что у вашего рисованного элемента есть прозрачный фон, либо создайте пользовательскую кнопку для маскировки рисованного элемента.
  2. Вы захотите использовать стиль Атрибут применять разные стили для каждой кнопки.Под этим я подразумеваю, что цвет, определенный в вашем custom_button.xml, должен ссылаться на атрибут цвета (что-то вроде colorAccent должно работать в вашем случае), а не на статический цвет.
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="?attr/colorAccent"/>
</shape>

Затем изменитеэтот цвет в стилях кнопок вместо android:color.

<style name="CategoryToggle">
    <item name="colorAccent">@color/YellowPrimary</item>
</style>

Убедитесь, что у вас добавлена ​​поддержка библиотеки поддержки , иначе colorAccent будет недоступен.

Используйте атрибут android:theme вместо атрибута style, чтобы применить тему кнопки.

<Button
    android:width="wrap_content"
    android:height="wrap_content"
    android:theme="@style/CategoryToggle"/>
Похоже, ваши рисованные объекты не используют квалификаторов ресурсов .Вам нужно убедиться, что каждый альтернативный ресурс имеет то же имя, что и оригинал (т. Е. Ваш icon_48mdpi.png должен вместо этого называться icon_48dp.png для всех конфигураций) и помещен в соответствующую папку для рисования для его плотности.Ваши ресурсы для рисования должны выглядеть следующим образом (в структуре представления Project , а не в структуре представления Android).
res/
|-- drawable/
|   +-- custom_button.xml
|-- drawable-hdpi/
|   +-- icon_48dp.png
|-- drawable-mdpi/
|   +-- icon_48dp.png
|-- drawable-xhdpi/
|   +-- icon_48dp.png
|-- drawable-xxhdpi/
|   +-- icon_48dp.png
|-- drawable-xxxhpdi/
|   +-- icon_48dp.png
~
Чтобы изменить цвет рисунка в зависимости от состояния, вам нужно сделать абстракцию цвета еще на один шаг и создать список состояний цвета .

res/color/button_color_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/pressed_color" android:state_pressed="true"/>
    <item android:color="@color/focused_color" android:state_focused="true"/>
    <item android:color="@color/state_hovered" android:state_hovered="true"/>
    <item android:color="?attr/colorAccent"/>
</selector>

Затем вы можете использовать этот цветовой ресурс в своей фигуре вместо colorAccent.

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/button_color_selector"/>
</shape>

Вы также можете сделать каждый изцвета в вашем цветовом состоянии перечисляют настраиваемый атрибут с помощью , определяя пользовательские атрибуты и ссылаясь на эти атрибуты в ваших стилях.Я не буду вдаваться в подробности ради краткости.

Вы можете сделать это для рисования аналогично, создав список состояний для рисования .


Наконец, вы захотите использовать dp вместо px, если вы не абсолютно уверены, вы хотите использовать px.Это предотвратит странные появления при разной плотности экрана.

0 голосов
/ 12 марта 2019

Привет Брайану за его понимание этого вопроса.Это привело меня к путям, которым я должен был следовать, чтобы решить эту проблему.Я публикую этот ответ, чтобы другие, кто сталкивался с подобными случаями, знали о шагах.Хотя у меня есть довольно много файлов, эта процедура отлично сработала.

  1. У меня есть пользовательская кнопка, как описано в ссылке , предоставленной Брайаном.

В остальном у меня есть следующее:

Изменить цвет текста: button_text_color.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/redPrimary" android:state_pressed="true"/>
    <item android:color="@color/redDark"/>
</selector>

Изменить фон: button_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:bottomLeftRadius="400dp" android:radius="100dp" android:topLeftRadius="400dp" />
            <solid android:color="@color/redDark" />
        </shape>
    </item>
    <item android:state_enabled="true">
        <shape android:shape="rectangle">
            <corners android:bottomLeftRadius="400dp" android:radius="100dp" android:topLeftRadius="400dp" />
            <solid android:color="@color/redPrimary" />
        </shape>
    </item>
</selector>

Изменить рисунок: button_drawable.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_button_inverted" android:state_pressed="true" />
    <item android:drawable="@drawable/ic_button"/>
</selector>

button_style.xml

<style name="MyButtonStyle">
        <item name="android:background">@drawable/button_background</item>
        <item name="android:drawableLeft">@drawable/button_drawable</item>
    <item name="android:text">@string/button_text</item>
    <item name="android:textColor">@color/button_text_color</item>
</style>

Реализация его в main_layout.xml

<packagename.MyCustomButton xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/myButton"
            style="@style/MyBUttonStyle"
            android:layout_marginBottom="8dp" />
0 голосов
/ 06 марта 2019

На 4 "есть ли способ (вернуть цвета при нажатии) для файлов .png" .. да, есть способы.

Опция by-the-book заключается в использовании стилей xml для задания различных элементов рисования для разных состояний кнопок.Рассмотрим ImageButton, который имеет пример этого в своих документах: https://developer.android.com/reference/android/widget/ImageButton.html

Другой вариант - это применить оттенки или другие фильтры к рисуемому в вашем собственном коде в обратных вызовах взаимодействия кнопок.По сравнению с использованием различных элементов рисования, в этом подходе вы добавляете пользовательский код вместо использования встроенных ресурсов, поэтому вы можете завершить тестирование и отладку большего количества данных на разных устройствах и получить полный контроль, чтобы вы могли создавать собственные анимации и другие сложные вещи, которые могут нехорошо вписывается в набор ресурсов Android.Можно оформить заказ setColorFilter для начинающих: https://developer.android.com/reference/android/widget/ImageView.html#setColorFilter(int,%20android.graphics.PorterDuff.Mode)

Спасибо за добавление кода и изображений или за вашу проблему, помогите понять это.

...