Chỉnh sửa (22.06.2016):
Thư viện Appcompat bắt đầu hỗ trợ các nút tài liệu sau khi tôi đăng phản hồi ban đầu. Trong bài viết này, bạn có thể thấy việc thực hiện dễ dàng nhất của các nút tăng và phẳng.
Câu trả lời gốc:
Vì AppCompat không hỗ trợ nút nhưng bạn có thể sử dụng xml làm hình nền. Để làm điều đó, tôi đã xem mã nguồn của Android và tìm thấy các tệp liên quan cho các nút vật liệu tạo kiểu.
1 - Nhìn vào việc thực hiện ban đầu của nút vật liệu từ nguồn.
Hãy xem btn_default_m vật liệu trên mã nguồn Android .
Bạn có thể sao chép tệp vào thư mục dự án drawable-v21. Nhưng đừng chạm vào màu attr ở đây. Tệp bạn cần thay đổi là tệp thứ hai.
drawable-v21 / custom_btn.xml
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight">
<item android:drawable="@drawable/btn_default_mtrl_shape" />
</ripple>
2 - Lấy hình dạng của nút vật liệu ban đầu
Như bạn nhận ra có một hình dạng được sử dụng bên trong drawable này mà bạn có thể tìm thấy trong tệp mã nguồn này .
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/button_inset_horizontal_material"
android:insetTop="@dimen/button_inset_vertical_material"
android:insetRight="@dimen/button_inset_horizontal_material"
android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle">
<corners android:radius="@dimen/control_corner_material" />
<solid android:color="?attr/colorButtonNormal" />
<padding android:left="@dimen/button_padding_horizontal_material"
android:top="@dimen/button_padding_vertical_material"
android:right="@dimen/button_padding_horizontal_material"
android:bottom="@dimen/button_padding_vertical_material" />
</shape>
3 - Lấy kích thước của nút vật liệu
Và trong tệp này, bạn có một số kích thước được sử dụng từ tệp mà bạn có thể tìm thấy ở đây . Bạn có thể sao chép toàn bộ tập tin và đưa vào thư mục giá trị của bạn . Điều này rất quan trọng để áp dụng cùng kích thước (được sử dụng trong các nút vật liệu) cho tất cả các nút
4 - Tạo một tệp có thể vẽ khác cho các phiên bản cũ
Đối với các phiên bản cũ hơn, bạn nên có một drawable khác có cùng tên. Tôi đang trực tiếp đặt các mục nội tuyến thay vì tham khảo. Bạn có thể muốn tham khảo chúng. Nhưng một lần nữa, điều quan trọng nhất là kích thước ban đầu của nút vật liệu.
drawable / custom_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed state -->
<item android:state_pressed="true">
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/button_inset_horizontal_material"
android:insetTop="@dimen/button_inset_vertical_material"
android:insetRight="@dimen/button_inset_horizontal_material"
android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle">
<corners android:radius="@dimen/control_corner_material" />
<solid android:color="@color/PRESSED_STATE_COLOR" />
<padding android:left="@dimen/button_padding_horizontal_material"
android:top="@dimen/button_padding_vertical_material"
android:right="@dimen/button_padding_horizontal_material"
android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>
</item>
<!-- focused state -->
<item android:state_focused="true">
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/button_inset_horizontal_material"
android:insetTop="@dimen/button_inset_vertical_material"
android:insetRight="@dimen/button_inset_horizontal_material"
android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle">
<corners android:radius="@dimen/control_corner_material" />
<solid android:color="@color/FOCUSED_STATE_COLOR" />
<padding android:left="@dimen/button_padding_horizontal_material"
android:top="@dimen/button_padding_vertical_material"
android:right="@dimen/button_padding_horizontal_material"
android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>
</item>
<!-- normal state -->
<item>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/button_inset_horizontal_material"
android:insetTop="@dimen/button_inset_vertical_material"
android:insetRight="@dimen/button_inset_horizontal_material"
android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle">
<corners android:radius="@dimen/control_corner_material" />
<solid android:color="@color/NORMAL_STATE_COLOR" />
<padding android:left="@dimen/button_padding_horizontal_material"
android:top="@dimen/button_padding_vertical_material"
android:right="@dimen/button_padding_horizontal_material"
android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>
</item>
</selector>
Kết quả
Nút của bạn sẽ có hiệu ứng gợn trên thiết bị Lollipop. Các phiên bản cũ sẽ có cùng một nút ngoại trừ hiệu ứng gợn. Nhưng vì bạn cung cấp các bản vẽ cho các trạng thái khác nhau, nên họ cũng sẽ phản hồi các sự kiện chạm (theo cách cũ).