Эффект нажатия кнопки, такой как ios [duplicate]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

218
задан Sathesh 15 December 2014 в 21:33
поделиться

16 ответов

Когда вы используете android:background, вы заменяете большую часть стиля и внешнего вида кнопки с пустым цветом.

Обновление: Начиная с версии версии 23.0.0 из AppCompat , существует новый стиль Widget.AppCompat.Button.Colored , который использует вашу тему colorButtonNormal для отключенного цвета и colorAccent для включенного цвета.

Это позволяет применить его к вашей кнопке напрямую через

<Button
  ...
  style="@style/Widget.AppCompat.Button.Colored" />

. Если вам нужны пользовательские colorButtonNormal или colorAccent, вы можете использовать ThemeOverlay, как описано в этот прокончик и android:theme на кнопке.

Предыдущий ответ

Вы можете использовать вытаскиваемый в вашем каталоге v21 для вашего фона, например:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?attr/colorControlHighlight">
    <item android:drawable="?attr/colorPrimary"/>
</ripple>

Это гарантирует, что цвет фона будет ?attr/colorPrimary и будет иметь анимацию пульсации по умолчанию, используя значение по умолчанию ?attr/colorControlHighlight (которое вы также можете установить в своей теме, если хотите).

Примечание: вам нужно создать настраиваемый селектор меньше, чем v21:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/primaryPressed" android:state_pressed="true"/>
    <item android:drawable="@color/primaryFocused" android:state_focused="true"/>
    <item android:drawable="@color/primary"/>
</selector>

Предполагая, что у вас есть некоторые цвета, которые вы хотели бы использовать по умолчанию, нажатию и сфокусированному состоянию. Лично я сделал скриншот рябь на полпути, выбрав ее, и вытащил из нее основное / сфокусированное состояние.

409
ответ дан ianhanniballake 19 August 2018 в 01:59
поделиться
  • 1
    Хороший ответ! Именно то, что я искал, однако необходимо было очистить и восстановить до того, как проект решил идентифицировать выталкиваемый в drawable-v21. – user1354603 6 November 2014 в 13:31
  • 2
    [Д0] stackoverflow.com/questions/26519979/… – gaara87 12 March 2015 в 04:46
  • 3
    @ianhanniballake Интересно, как объединить эту технику работы, не теряя округленные углы настройки в этой кнопке – Joaquin Iurchuk 24 August 2015 в 16:14
  • 4
    @ianhanniballake просто комментарий, вытягиваемый в рябке под & lt; item android: drawable ... / & gt; не может быть прозрачным цветом. В этом случае пульсация не будет показана. Мне потребовалось некоторое время, чтобы понять это. – Ivan Kušt 26 August 2015 в 07:45
  • 5
    С appcompat 23.1.1 и API 22 отключенное и включенное состояние принимают цвет colorButtonNormal. – Rémy DAVID 11 February 2016 в 13:08

Если вас интересует ImageButton, вы можете попробовать эту простую вещь:

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/ic_button"
    android:background="?attr/selectableItemBackgroundBorderless"
/>
4
ответ дан Ameer Khalifullah 19 August 2018 в 01:59
поделиться
<android.support.v7.widget.AppCompatButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:backgroundTint="#fff"
    android:textColor="#000"
    android:text="test"/>

Используйте

xmlns:app="http://schemas.android.com/apk/res-auto"

, и цвет примет на предварительном леллипопе

3
ответ дан André Bäuml 19 August 2018 в 01:59
поделиться

v22.1 of appcompat-v7 ввел некоторые новые возможности. Теперь можно назначить конкретную тему только одному виду.

Устаревшее использование приложения: тема для стилизации панели инструментов. Теперь вы можете использовать андроид: тему для панелей инструментов на всех устройствах уровня API 7 и выше и поддержку андроидов: тема для всех виджетов на устройствах уровня 11 и выше.

Таким образом, вместо того, цвет в глобальной теме, мы создаем новый и присваиваем его только Button

Пример:

<style name="MyColorButton" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorButtonNormal">@color/myColor</item>
</style>

И используйте этот стиль в качестве темы вашего Button

<Button
 style="?android:attr/buttonStyleSmall"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="Button1"
 android:theme="@style/MyColorButton"/>
5
ответ дан Bhargav Thanki 19 August 2018 в 01:59
поделиться

Сегодня я столкнулся с этой проблемой, фактически играя с библиотекой v22.

Предполагая, что вы используете стили, вы можете установить свойство colorButtonNormal, и кнопки будут использовать этот цвет по умолчанию.

<style name="AppTheme" parent="BaseTheme">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/primaryColor</item>
    <item name="colorPrimaryDark">@color/primaryColorDark</item>
    <item name="colorAccent">@color/accentColor</item>
    <item name="colorButtonNormal">@color/primaryColor</item>
</style>

Помимо этого вы все равно можете создать стиль для кнопки, а затем использовать это для каждой кнопки, если вам нужен набор цветов (не тестировались, просто спекулировали).

Не забудьте добавить android: перед именами элементов в вашем стиле v21 .

24
ответ дан Ethaan 19 August 2018 в 01:59
поделиться
  • 1
    Для набора цветных кнопок см. Другой ответ Роберта: stackoverflow.com/a/31825439/1617737 – ban-geoengineering 25 January 2017 в 16:53
  • 2
    С установленным цветом фона, существует ли также общий атрибут, который я могу использовать в приведенном выше блоке кода, чтобы указать цвет текста кнопки? – ban-geoengineering 25 January 2017 в 16:54

Ответ @ ianhanniballake абсолютно правильный и прост. Но мне потребовалось несколько дней, чтобы понять. Для тех, кто не понимает его ответа, здесь более подробно реализовано

<Button
        android:id="@+id/btn"
        style="@style/MaterialButton"
        ... />


<style name="MaterialButton" parent="Widget.AppCompat.Button.Colored">
    <item name="android:theme">@style/Theme.MaterialButton</item>
   ...
</style>


<style name="Theme.MaterialButton" parent="YourTheme">
    <item name="colorAccent">@color/yourAccentColor</item>
    <item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>

=== Или ===

<Button
        android:id="@+id/btn"
        style="@style/Widget.AppCompat.Button.Colored"
        android:theme="@style/Theme.MaterialButton" />

<style name="Theme.MaterialButton" parent="YourTheme">
    <item name="colorAccent">@color/yourAccentColor</item>
    <item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>
20
ответ дан Frank Nguyen 19 August 2018 в 01:59
поделиться
  • 1
    Ваш ответ был последним головоломкой для меня. Можно также написать colorButtonNormal в базовой теме @style/AppTheme. Это дает цвет по умолчанию для AppCompat, чтобы соответствующим образом раскрасить кнопки. А затем можно использовать свой ответ на тему в отдельности. – Siddharth Pant 29 January 2016 в 21:05
  • 2
    Это android:theme="Theme.MaterialButton" или android:theme="@style/Theme.MaterialButton" – osrl 14 November 2016 в 14:23
  • 3
    @osrl Это android:theme="@style/Theme.MaterialButton". Спасибо за вашу правильность. – Frank Nguyen 8 December 2017 в 02:55
  • 4
    Спасибо за его работу для меня – Jatin Patel 23 March 2018 в 14:40

Если вам нравится использовать стороннюю библиотеку, проверьте traex / RippleEffect . Это позволяет добавить эффект Ripple в ANY view с помощью всего нескольких строк кода. Вам просто нужно обернуть в вашем файле макета xml элемент, который вы хотите иметь эффект пульсации с контейнером com.andexert.library.RippleView.

В качестве дополнительного бонуса он требует Min SDK 9, поэтому вы можете иметь согласованность дизайна в версиях ОС.

Вот пример, взятый из репликации библиотек GitHub:

<com.andexert.library.RippleView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:rv_centered="true">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@android:drawable/ic_menu_edit"
        android:background="@android:color/holo_blue_dark"/> 

</com.andexert.library.RippleView>

Вы можете изменить цвет пульсации, добавив этот атрибут в элемент RippleView: app:rv_color="@color/my_fancy_ripple_color

3
ответ дан guy.gc 19 August 2018 в 01:59
поделиться

Я пришел в это сообщение, ища способ иметь цвет фона моего пункта ListView, но сохраняю рябь.

Я просто добавил свой цвет в качестве фона и selectableItemBackground в качестве переднего плана :

<style name="my_list_item">
    <item name="android:background">@color/white</item>
    <item name="android:foreground">?attr/selectableItemBackground</item>
    <item name="android:layout_height">@dimen/my_list_item_height</item>
</style>

, и это работает как шарм. Я предполагаю, что тот же метод можно использовать и для кнопок. Удачи:)

5
ответ дан Joakim 19 August 2018 в 01:59
поделиться

Вот простой и обратный совместимый способ доставить эффект пульсации на поднятые кнопки с пользовательским фоном.

Ваш макет должен выглядеть следующим образом:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/my_custom_background"
    android:foreground="?android:attr/selectableItemBackground"/>
77
ответ дан Kate 19 August 2018 в 01:59
поделиться
  • 1
    Это самый простой способ суеты для этого. Хороший ответ. – Tyler Pfaff 8 February 2016 в 23:46
  • 2
    api 21+, но не работает. Применяется на линейной компоновке с clickable-true, background - разным цветом, указанным переднего плана. – Alex 27 October 2016 в 21:25
  • 3
    Поскольку Button является TextView, а не FrameLayout, foreground не действует до 23. google.com/… – androidguy 1 December 2016 в 09:18
  • 4
    ХОРОШИЙ! Я даже не знал «передний план». была вещь! – Eric Schlenz 1 March 2017 в 17:50
  • 5
    Работает как шарм ..! – Kannan 30 May 2017 в 07:15

Существует еще одно простое решение для создания настраиваемого фона для кнопок «Плоский», сохраняя при этом их «материальные» эффекты.

  1. Поместите свою кнопку в ViewGroup с желаемым фоном, установленным там
  2. set selectableItemBackground из текущей темы в качестве фона для вашей кнопки (API> = 11)

т.е. :

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/blue">
    <Button
        style="?android:attr/buttonStyleSmall"
        android:background="?android:attr/selectableItemBackground"
        android:textColor="@android:color/white"
        android:textAllCaps="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Button1"
        />
</FrameLayout>

Может использоваться для кнопок Flat , он работает с API> = 11, и вы получите эффект пульсации на> = 21 устройствах, сохраняя регулярные кнопки на предустановке -21 до AppCompat обновляется, чтобы поддерживать там пульсацию.

Вы также можете использовать selectableItemBackgroundBorderless только для кнопок = =.

87
ответ дан kiruwka 19 August 2018 в 01:59
поделиться
  • 1
    Вы буквально мыслили из коробки :-) Хотя это один из способов сделать это, это может увеличить сцепление кода, и использование стилей было бы рекомендуемым способом. – Sathesh 20 March 2015 в 00:44
  • 2
    Это создает плоскую кнопку с цветным фоном, да. Но созданная кнопка выглядит как квадрат, не закругленные углы и тени. – Sanket Berde 7 June 2015 в 07:11
  • 3
    @SanketBerde Точно. Потому что это то, что «плоский» кнопка есть. – kiruwka 7 June 2015 в 14:36
  • 4
    Первоначальный вопрос не упоминался как плоский. btw, если у вас есть & lt; CardView & gt; родителя в вашем решении вместо & lt; FrameLayout & gt; , результирующая кнопка будет поднята и будет иметь тени. Это даже работает в версиях до леллипопа. – Sanket Berde 8 June 2015 в 03:36
  • 5
    @SanketBerde отлично знает о подходе CardView, спасибо за обмен! – kiruwka 8 June 2015 в 08:02

В великом учебнике объясняются два подхода: Алекс Локвуд: http://www.androiddesignpatterns.com/2016/08/coloring-buttons-with-themeoverlays-background-tints.html :

Подход # 1: изменение цвета фона кнопки с ThemeOverlay

<!-- res/values/themes.xml -->
<style name="RedButtonLightTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">@color/googred500</item>
</style>

<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:theme="@style/RedButtonLightTheme"/>

Подход # 2: установка фонового оттенка AppCompatButton

<!-- res/color/btn_colored_background_tint.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Disabled state. -->
    <item android:state_enabled="false"
          android:color="?attr/colorButtonNormal"
          android:alpha="?android:attr/disabledAlpha"/>

    <!-- Enabled state. -->
    <item android:color="?attr/colorAccent"/>

</selector>

<android.support.v7.widget.AppCompatButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:backgroundTint="@color/btn_colored_background_tint"/>
2
ответ дан makovkastar 19 August 2018 в 01:59
поделиться

Программное применение цветов:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {

    ColorStateList colorStateListRipple = new ColorStateList(
            new int[][] {{0}},
            new int[] {Color.WHITE} // ripple color
            );

    RippleDrawable rippleDrawable = (RippleDrawable) myButton.getBackground();
    rippleDrawable.setColor(colorStateListRipple);
    myButton.setBackground(rippleDrawable); // applying the ripple color
}

ColorStateList colorStateList = new ColorStateList(
        new int[][]{
                new int[]{android.R.attr.state_pressed}, // when pressed
                new int[]{android.R.attr.state_enabled}, // normal state color
                new int[]{} // normal state color
        },
        new int[]{
                Color.CYAN, // when pressed
                Color.RED, // normal state color
                Color.RED // normal state color
        }
);

ViewCompat.setBackgroundTintList(myButton, colorStateList); // applying the state colors
0
ответ дан Marlon 19 August 2018 в 01:59
поделиться

С AppCompat (22.1.1+) вы можете добавить такой стиль:

<style name="MyGreenButton">
    <item name="colorButtonNormal">#009900</item>
</style>

И использовать его, просто применяя стиль:

<android.support.v7.widget.AppCompatButton
    style="@style/MyGreenButton"
    android:layout_width="match_width"
    android:layout_height="wrap_content"
    android:text="A Green Button"
    />

Программно изменяя цвет, я обнаружил, что единственный способ обновить цвет (на API 15 или 16) - это использовать вместо этого «список оттенков фона». И он не удаляет симпатичную радиальную анимацию на устройствах API 21:

ColorStateList colorStateList = new ColorStateList(new int[][] {{0}}, new int[] {0xFF009900}); // 0xAARRGGBB
button.setSupportBackgroundTintList(colorStateList);

Поскольку button.setBackground(...) и button.getBackground().mutate().setColorFilter(...) не меняют цвет кнопки на API 15 и 16, как на API 21 .

23
ответ дан Robert 19 August 2018 в 01:59
поделиться
  • 1
    Большое вам спасибо, он отлично работал для меня (даже если использовать Button в xml-макетах, поскольку надуватель AppCompat заменяет его AppCompatButton) – Louis CAD 21 September 2015 в 01:04
  • 2
    Используйте ColorStateList.valueOf( ... ) для создания простого ColorStateList только одного цвета. – Taig 5 September 2016 в 13:32
  • 3
    colorAccent и rippleColor не работают в стиле – Yar 28 September 2016 в 16:56
  • 4
    Спасибо тебе за этот пост. Что сработало для меня: ViewCompat.setBackgroundTintList(myButton, ColorStateList.valueOf(myColor); Javadoc для setSupportBackgroundTintList говорит, что его следует называть таким образом. – JerabekJakub 24 November 2017 в 10:45

Используйте backgroundTint вместо background

4
ответ дан shem 19 August 2018 в 01:59
поделиться

Я попробовал это:

android:backgroundTint:"@color/mycolor"

вместо изменения свойства фона. Это не устраняет материальный эффект.

-1
ответ дан shiladitya 19 August 2018 в 01:59
поделиться
  • 1
    Это не будет работать для устройств с предварительным Lollipop (70% рынка). Фактически, он был backported, но Android Studio на данный момент по-прежнему показывает ошибки при использовании без префикса android. – Siddharth Pant 29 January 2016 в 21:15
  • 2
    Спасибо, хорошая работа для меня. – Suresh Kerai 14 April 2017 в 16:01

Я использовал backgroundTint и переднего плана:

<Button
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:backgroundTint="@color/colorAccent"
    android:foreground="?android:attr/selectableItemBackground"
    android:textColor="@android:color/white"
    android:textSize="10sp"/>
12
ответ дан SpyZip 19 August 2018 в 01:59
поделиться
  • 1
    это должен быть принятый ответ. – karthik prasad 6 April 2017 в 19:16
  • 2
    afaik нет необходимости для атрибута переднего плана, поскольку backgroundTint не отменяет стандартную пульсацию – Julian Os 24 April 2017 в 20:41
  • 3
    спасибо за ответ на его работу для меня – Jatin Patel 25 May 2017 в 05:55
Другие вопросы по тегам:

Похожие вопросы: