Lollipop 上的 Android Button Ripple 和 pre lollipop 上的高亮显示

Posted

技术标签:

【中文标题】Lollipop 上的 Android Button Ripple 和 pre lollipop 上的高亮显示【英文标题】:Android Button Ripple on Lollipop and highlight on pre lollipop 【发布时间】:2015-12-11 18:42:58 【问题描述】:

嗨,所以我有点困惑,想知道是否有人能指出我正确的方向。

在 Lollipop 和 pre-lollipop 上使用 Google Play 商店

您会在棒棒糖上看到可选择的视图具有连锁反应。

在棒棒糖前,你会得到这种高光效果。

这是怎么做到的?

目前在我的应用程序中,我有一个包含此选择器的 drawable-v21 目录

它基本上会在我的背景上产生涟漪

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight">
    <item android:id="@android:id/mask" android:drawable="@android:color/white"/>
    <item android:drawable="@color/colorAccentWith92PercentOpacity"/>
</ripple>

但是,其他答案说要使用

android:background="?attr/selectableItemBackground"

在棒棒糖前获得高亮效果,但这会覆盖我的背景。我怎样才能在我当前的背景之上设置它?

我还必须为我的应用程序中的每种按钮创建一个可绘制的波纹(在 drawble-v21 中)吗?我将如何为回收商查看项目执行此操作?

是什么让这个问题与众不同

我不希望在棒棒糖前出现波纹

【问题讨论】:

how to create ripple effect for pre-lollipop 的可能重复项 不,它不是重复的,因为它是一个不同的问题。请恢复 【参考方案1】:

选项 1

在您的主题中定义 colorControlHighlight,只要您使用默认的 appcompat-v7 按钮,突出显示颜色就可以开箱即用。

选项 2

这是一个示例,说明我如何在不使用外部库的情况下通过一些交叉淡入淡出动画和阴影向后移植 Material 按钮样式。愿它在你的路上帮助你。

如果按钮将是深色背景 (@color/control_normal) 上的白色文本并带有浅色突出显示:

values/themes.xml

这里我将覆盖整个主题的默认按钮样式:

<style name="AppTheme" parent="Base.AppTheme">
    <item name="buttonStyle">@style/Widget.AppTheme.Button</item>
</style>

值/整数.xml

<!-- Some numbers pulled from material design. -->
<integer name="button_pressed_animation_duration">100</integer>
<integer name="button_pressed_animation_delay">100</integer>

values-v21/styles.xml

棒棒糖的按钮样式,它理解主题覆盖并默认使用波纹。让我们用适当的颜料给波纹上色:

<style name="Widget.AppTheme.Button" parent="Widget.AppCompat.Button">
    <!-- On Lollipop you can define theme via style. -->
    <item name="android:theme">@style/ThemeOverlay.AppTheme.Button</item>
</style>

<style name="ThemeOverlay.AppTheme.Button" parent="ThemeOverlay.AppCompat.Dark">
    <!-- The magic is done here. -->
    <item name="colorButtonNormal">@color/control_normal</item>
</style>

值/样式.xml

在棒棒糖之前,它变得很棘手。

<style name="Widget.AppTheme.Button" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/button_normal_background</item>
</style>

drawable/button_normal_background.xml

这是整个按钮的复合drawable。

<inset
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="@dimen/abc_button_inset_horizontal_material"
    android:insetTop="@dimen/abc_button_inset_vertical_material"
    android:insetRight="@dimen/abc_button_inset_horizontal_material"
    android:insetBottom="@dimen/abc_button_inset_vertical_material">
    <layer-list>
        <!-- Shadow. -->
        <item
            android:drawable="@drawable/button_shadow"
            android:top="-0dp"
            android:bottom="-1dp"
            android:left="-0dp"
            android:right="-0dp"/>
        <item
            android:drawable="@drawable/button_shadow_pressable"
            android:top="-0dp"
            android:bottom="-3dp"
            android:left="-1dp"
            android:right="-1dp"/>
        <!-- Background. -->
        <item android:drawable="@drawable/button_shape_normal"/>
        <!-- Highlight. -->
        <item>
            <selector
                android:enterFadeDuration="@integer/button_pressed_animation_duration"
                android:exitFadeDuration="@integer/button_pressed_animation_duration">

                <item
                    android:drawable="@drawable/button_shape_highlight"
                    android:state_focused="true"
                    android:state_enabled="true"/>
                <item
                    android:drawable="@drawable/button_shape_highlight"
                    android:state_pressed="true"
                    android:state_enabled="true"/>
                <item
                    android:drawable="@drawable/button_shape_highlight"
                    android:state_selected="true"
                    android:state_enabled="true"/>
                <item android:drawable="@android:color/transparent"/>
            </selector>
        </item>
        <!-- Inner padding. -->
        <item android:drawable="@drawable/button_padding"/>
    </layer-list>
</inset>

drawable/button_shadow.xml

这是未按下时的阴影。

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners
        android:bottomLeftRadius="3dp"
        android:bottomRightRadius="3dp"
        android:topLeftRadius="2dp"
        android:topRightRadius="2dp"/>
  <solid android:color="#2000"/>
</shape>

drawable/button_shadow_pressable.xml

这是按下状态下的扩展阴影。结果效果近距离看很粗糙,但从远处看就足够了。

<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="UnusedAttribute"
    android:enterFadeDuration="@integer/button_pressed_animation_duration"
    android:exitFadeDuration="@integer/button_pressed_animation_duration">
    <item
        android:state_pressed="true"
        android:state_enabled="true">
        <shape
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <corners
                android:bottomLeftRadius="5dp"
                android:bottomRightRadius="5dp"
                android:topLeftRadius="3dp"
                android:topRightRadius="3dp"/>
            <solid android:color="#20000000"/>
        </shape>
    </item>
    <item android:drawable="@android:color/transparent"/>
</selector>

drawable/button_shape_normal.xml

这是主要的按钮形状。

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="@dimen/abc_control_corner_material"/>
    <solid android:color="@color/control_normal"/>
</shape>

drawable/button_padding.xml

只是额外的填充与材质按钮绝对一致。

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/transparent"/>
    <padding
        android:left="@dimen/abc_button_padding_horizontal_material"
        android:top="@dimen/abc_button_padding_vertical_material"
        android:right="@dimen/abc_button_padding_horizontal_material"
        android:bottom="@dimen/abc_button_padding_vertical_material"/>
</shape>

drawable/button_shape_highlight.xml

这是在普通按钮形状上绘制的高亮按钮形状。

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="@dimen/abc_control_corner_material"/>
    <solid android:color="@color/control_highlight"/>
</shape>

@color/control_highlight可以指向

@color/ripple_material_dark - 半透明白色,用于深色背景 @color/ripple_material_light - 半透明黑色,在浅色背景下使用 您定义的任何其他颜色。

【讨论】:

这看起来很有希望,我想试试,但是 button_shape_highlight 不见了? @ReubenScratton 谢谢,已修复。【参考方案2】:

您可以通过这种方式设置视图的背景:

android:background="@drawable/touch_selector"

为 pre lollipop 创建一个没有波纹的版本: drawable/touch_selector.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">  
    <!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
    <item android:state_pressed="true"
        android:drawable="@color/grey"
        />

    <!-- For ListView in SINGLE_CHOICE_MODE, it flags the active row -->
    <item android:state_activated="true"
          android:drawable="@color/light_green" />

    <!-- Default, "just hangin' out" state. -->
    <item android:drawable="@android:color/transparent" />
</selector>

现在对棒棒糖及以上做同样的事情, 但有连锁反应: 克里特 drawable-v21/touch_selector.xml

它看起来像:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
    <item android:state_pressed="true">
        <ripple android:color="@color/grey" />
    </item>

    <!-- For ListView, when the view is "activated".  In SINGLE_CHOICE_MODE, it flags the active row -->
    <item android:state_activated="true"
          android:drawable="@color/light_green" />

    <!-- Default, "just hangin' out" state. -->
    <item android:drawable="@android:color/transparent" />
</selector>

就是这样。 现在您在棒棒糖及以上设备上具有涟漪效应,并在棒棒糖前突出显示。

编辑: 如果在 ListView 中使用 - 使用上面创建的作为 ListView 项目的背景

【讨论】:

以上是关于Lollipop 上的 Android Button Ripple 和 pre lollipop 上的高亮显示的主要内容,如果未能解决你的问题,请参考以下文章

Android 5.0 Lollipop 上的 UnsatisfiedLinkError

Android onChange 事件未在 contentObserver 中触发,用于 android 5 (Lollipop) 上的 chrome 历史记录

Android Lollipop 上的键盘隐藏崩溃

Android Lollipop 上的高程 + 透明度错误

Material Design 中呈现的 Android Lollipop 上的半透明渐变状态栏

Android Lollipop 问题 - 无法将图像从相机加载到 ImageView