改变Button的形状,同时保持其材料设计的波纹效果

时间:2016-09-13 19:00:04

标签: android shape android-selector

我想创建具有自定义形状的Button,它会在主题 " Base.Widget.AppCompat.Button.Colored" 中作出反应

然而,因为我必须自定义它的形状(圆角我必须覆盖它的android:background - 这是迄今为止我知道的唯一方法(不...不,我不会使用的FrameLayout )。 目前,我们可以通过在xml文件中提供我们的自定义<shape>作为背景绘制来

最有希望的代码,启用 selectableItemBackground - 对我来说非常重要,是:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="@color/colorAccent"/>
            <corners android:topLeftRadius="@dimen/button_shape_radius"
                android:topRightRadius="@dimen/button_shape_radius"/>
        </shape>
    </item>

    <item android:drawable="?attr/selectableItemBackground">
        <shape>
            <solid/>
            <corners android:topLeftRadius="@dimen/button_shape_radius"
                android:topRightRadius="@dimen/button_shape_radius"/>
        </shape>
    </item>
</layer-list>

不幸的是,我无法用<item android:drawable="?attr/selectableItemBackground">塑造第二项,因此最终按下的项目的形状是矩形。 enter image description here

如果有人会给我这个问题的答案,我会说。 我使用API​​_MIN = 16,所以不能使用涟漪效应。我也不想使用FrameLayout或外部库来强迫我用一些东西包装Button。

1 个答案:

答案 0 :(得分:1)

如果纹波低于21,您可以使用此库Ripple Effect使用没有纹波标记的形状并使用RippleView围绕视图以获取更多详细信息,您可以查看Usage部分

21+你可以尝试这个我没有测试但它应该工作,把它放在文件夹drawable-v21

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight">
<item>
    <shape>
        <solid android:color="@color/colorAccent"/>
        <corners android:topLeftRadius="@dimen/button_shape_radius"
            android:topRightRadius="@dimen/button_shape_radius"/>
    </shape>
</item>

<item android:drawable="?attr/selectableItemBackground">
    <shape>
        <solid/>
        <corners android:topLeftRadius="@dimen/button_shape_radius"
            android:topRightRadius="@dimen/button_shape_radius"/>
    </shape>
</item>
</ripple>

<强>更新

我将Ripple Effect的源代码更改为按钮

您可以获取代码here

<强> USAGE

就像任何普通按钮一样

XML

<path.to.the.RippleButton
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/button_rounded_top_blue"
    android:id="@+id/mybutton"/>

<强>爪哇

RippleButton button = (RippleButton) findViewById(R.id.mybutton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainScreen.this, "You did it", Toast.LENGTH_SHORT).show();
            }
        });

如果您需要其他视图,您只需对源代码进行一些调整就很容易(在我看来)