Android - viền cho nút


Câu trả lời:


431

Bước 1: Tạo tệp có tên: my_button_bg.xml

Bước 2: Đặt tệp này vào res / drawables.xml

Bước 3: Chèn mã bên dưới

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <gradient android:startColor="#FFFFFF" 
    android:endColor="#00FF00"
    android:angle="270" />
  <corners android:radius="3dp" />
  <stroke android:width="5px" android:color="#000000" />
</shape>

Bước 4: Sử dụng mã "android: background =" @ drawable / my_button_bg "khi cần, ví dụ như bên dưới:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Your Text"
    android:background="@drawable/my_button_bg"
    />

1
cảm ơn. + 1 cho việc này. Sau khi lưu nó vào thư mục drawable dưới dạng tệp xml. Làm thế nào chúng ta có thể sử dụng nó?
Kẻ giết người Android

1
@AndroidPower bạn có thể sử dụng nó với R.drawable.FILE_NAME
slayton

2
Mã này đi đâu, trong mã .axml để đánh dấu cho nút? Có phải nó đi trong một tệp kiểu tệp XML không?
theJerm

Tôi chỉ sử dụng nét (và làm cho nó màu trắng) để phác thảo một Nút có màu trắng. Hoạt động tuyệt vời với 4.4 nhưng trong 4.0.3 nút chuyển sang màu đen - có ý tưởng nào tại sao không?
Kibi

1
@Kibi xin lỗi ai đó đã chỉnh sửa câu trả lời của tôi và cho bạn lời khuyên không chính xác. Tôi đã thay đổi nhưng tôi bị sốc khi ai đó có thể chỉnh sửa câu trả lời được chấp nhận và thay đổi tính hữu ích.
Pedantic 11/2/2016

57

Android Official Solution

Kể từ khi Hỗ trợ thiết kế Android v28 được giới thiệu, thật dễ dàng để tạo nút viền bằng cách sử dụng MaterialButton. Lớp này cung cấp các kiểu Vật liệu được cập nhật cho nút trong hàm tạo. Sử dụng app:strokeColorapp:strokeWidthbạn có thể tạo đường viền tùy chỉnh như sau:


1. Khi bạn sử dụng androidx:

xây dựng. nâng cấp

dependencies {
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.0.0'
}

• Nút viền:

<com.google.android.material.button.MaterialButton
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="MATERIAL BUTTON"
    android:textSize="15sp"
    app:strokeColor="@color/green"
    app:strokeWidth="2dp" />

• Nút viền không viền:

<com.google.android.material.button.MaterialButton
    style="@style/Widget.AppCompat.Button.Borderless"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="UNFILLED MATERIAL BUTTON"
    android:textColor="@color/green"
    android:textSize="15sp"
    app:backgroundTint="@android:color/transparent"
    app:cornerRadius="8dp"
    app:rippleColor="#33AAAAAA"
    app:strokeColor="@color/green"
    app:strokeWidth="2dp" />



2. Khi bạn sử dụng appcompat:

xây dựng. nâng cấp

dependencies {
    implementation 'com.android.support:design:28.0.0'
}

style.xml

Đảm bảo chủ đề ứng dụng của bạn kế thừa từ Theme.MaterialComponentsthay vì Theme.AppCompat.

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
    <!-- Customize your theme here. -->
</style>

• Nút viền:

<android.support.design.button.MaterialButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="MATERIAL BUTTON"
    android:textSize="15sp"
    app:strokeColor="@color/green"
    app:strokeWidth="2dp" />

• Nút viền không viền:

<android.support.design.button.MaterialButton
    style="@style/Widget.AppCompat.Button.Borderless"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="UNFILLED MATERIAL BUTTON"
    android:textColor="@color/green"
    android:textSize="15sp"
    app:backgroundTint="@android:color/transparent"
    app:cornerRadius="8dp"
    app:rippleColor="#33AAAAAA"
    app:strokeColor="@color/green"
    app:strokeWidth="2dp" />



Kết quả trực quan

nhập mô tả hình ảnh ở đây


Tôi thấy bạn đã có textColor và textSize được khai báo trong nút XML của bạn. Bạn có đề xuất gì nếu ai đó đã có một kiểu được xác định cho textColor và textSize và bây giờ họ muốn thêm style="@style/Widget.AppCompat.Button.Borderless"?
Ai đó ở đâu đó


Như bạn đã đề cập, có thể xác định một kiểu kế thừa từ kiểu không viền, sau đó thêm các thuộc tính ưa thích theo kiểu cơ sở.
aminography

Hơi OT, nhưng biểu tượng thứ 4 thú vị trong thanh hành động ở cuối GIF là gì? (Ngoài ra, có vẻ như GIF được lấy từ một thiết bị thực, tuyệt vời)
i336_

1
Có thể tôi sai nhưng đối với tôi trong • Nút không viền, tôi đã phải thay đổi, ứng dụng: backgroundTint = "@ color / minh bạch" thành ứng dụng: backgroundTint = "@ android: color / minh bạch"
xarly

37

Tạo button_border.xmltập tin trong thư mục drawable của bạn.

res / drawable / button_border.xml

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

    <solid android:color="#FFDA8200" />

    <stroke
        android:width="3dp"
        android:color="#FFFF4917" />

</shape>

Và thêm nút vào bố cục hoạt động XML của bạn và đặt nền android:background="@drawable/button_border".

        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/button_border"
                android:text="Button Border" />

19

tạo drawable / button_green.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <gradient
    android:startColor="#003000"
    android:centerColor="#006000"
    android:endColor="#003000"
    android:angle="270" />
  <corners android:radius="5dp" />
  <stroke android:width="2px" android:color="#007000" />
</shape>

và chỉ ra nó là @drawable/button_green:

<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="@drawable/button_green"
        android:text="Button" />


8

Nếu nút của bạn không yêu cầu nền trong suốt, thì bạn có thể tạo ảo ảnh về đường viền bằng cách sử dụng Bố cục khung. Chỉ cần điều chỉnh thuộc tính "phần đệm" của FrameLayout để thay đổi độ dày của đường viền.

<FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="1sp"
        android:background="#000000">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Your text goes here"
            android:background="@color/white"
            android:textColor="@color/black"
            android:padding="10sp"
            />
</FrameLayout>

Tôi không chắc các tệp hình xml có màu đường viền có thể chỉnh sửa động hay không. Nhưng tôi biết rằng với giải pháp này, bạn có thể tự động thay đổi màu của đường viền bằng cách đặt nền FrameLayout.


6

Trong bố cục XML của bạn:

<Button
    android:id="@+id/cancelskill"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="25dp"
    android:layout_weight="1"
    android:background="@drawable/button_border"
    android:padding="10dp"
    android:text="Cancel"
    android:textAllCaps="false"
    android:textColor="#ffffff"
    android:textSize="20dp" />

Trong thư mục drawable, tạo một tệp cho kiểu viền của nút:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <stroke
        android:width="1dp"
        android:color="#f43f10" />
</shape>

Và trong Hoạt động của bạn:

    GradientDrawable gd1 = new GradientDrawable();
    gd1.setColor(0xFFF43F10); // Changes this drawbale to use a single color instead of a gradient
    gd1.setCornerRadius(5);
    gd1.setStroke(1, 0xFFF43F10);

    cancelskill.setBackgroundDrawable(gd1);

    cancelskill.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            cancelskill.setBackgroundColor(Color.parseColor("#ffffff"));
            cancelskill.setTextColor(Color.parseColor("#f43f10"));

            GradientDrawable gd = new GradientDrawable();

            gd.setColor(0xFFFFFFFF); // Changes this drawbale to use a single color instead of a gradient
            gd.setCornerRadius(5);
            gd.setStroke(1, 0xFFF43F10);
            cancelskill.setBackgroundDrawable(gd);

            finish();
        }
    });

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.