Thanh tiến trình với các góc tròn?


82

Tôi đang cố gắng đạt được thiết kế thanh tiến trình này: nhập mô tả hình ảnh ở đây

Mã hiện tại mà tôi đã tạo: nhập mô tả hình ảnh ở đây

Đây là mã:

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="8dp"/>
        <solid android:color="@color/dirtyWhite"/>
    </shape>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners android:radius="8dp"/>
            <solid android:color="@color/colorPrimaryDark"/>
        </shape>
    </clip>
</item>

Thanh tiến trình của tôi:

 <ProgressBar
            android:id="@+id/activeProgress"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:progress="10"
            android:progressDrawable="@drawable/rounded_corners_progress_bar"/>

Tôi đã thử thêm <size>thuộc tính vào <shape>trong <clipđể làm cho hình dạng tiến trình nhỏ hơn một chút nhưng nó không hoạt động. Ngoài ra, thanh tiến trình phẳng và tôi muốn được uốn cong theo thiết kế. Tôi cần thay đổi điều gì để đạt được thiết kế?


Câu trả lời:


163

Làm thế nào để làm cho hình dạng tiến trình nhỏ hơn một chút?

Bạn cần tạo một khoảng đệm nhỏ cho mục tiến trình, như sau:

<item android:id="@android:id/progress"
    android:top="2dp"
    android:bottom="2dp"
    android:left="2dp"
    android:right="2dp">

Làm thế nào để làm cho thanh tiến trình được uốn cong theo thiết kế?

Thay thế <clip></clip>phần tử, bằng <scale android:scaleWidth="100%"></scale>. Điều đó sẽ làm cho hình dạng giữ nguyên hình dạng khi lớn lên - và không bị cắt bỏ. Thật không may, nó sẽ có một chút hiệu ứng hình ảnh không mong muốn khi bắt đầu - vì các góc của hình dạng không có đủ không gian để vẽ. Nhưng nó có thể đủ tốt cho hầu hết các trường hợp.

Mã đầy đủ:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@android:id/background">
    <shape>
        <corners android:radius="8dp"/>
        <solid android:color="@color/dirtyWhite"/>
    </shape>
 </item>

 <item android:id="@android:id/progress"
    android:top="1dp"
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp">

    <scale android:scaleWidth="100%">
        <shape>
            <corners android:radius="8dp"/>
            <solid android:color="@color/colorPrimaryDark"/>
        </shape>
    </scale>
 </item>
</layer-list>

4
@habibullah Việc sử dụng ProgressBar và Layer-List gốc là rất hạn chế. Bạn có thể dễ dàng triển khai thanh tiến trình tùy chỉnh để phù hợp với nhu cầu của mình. Ví dụ: nếu bạn có nền đồng nhất - chỉ cần sử dụng đường dẫn 9 ở nền trước để ẩn mọi thứ trừ tiến trình. Nếu bạn đang nhắm mục tiêu đến các Phiên bản Android mới hơn, bạn có thể chỉ cần sử dụng hỗ trợ mặt nạ tích hợp sẵn (không được hỗ trợ trong các phiên bản cũ hơn). Một tùy chọn khác là sử dụng thư viện, điều này có thể tốt cho bạn: github.com/akexorcist/Android-RoundCornerProgressBar . Nếu bạn vẫn gặp sự cố, vui lòng đăng câu hỏi mới. Chúc mừng.
Eyal Biran

1
@AkshayMahajan xem nhận xét ở trên
Eyal Biran

1
Khi tôi áp dụng mã đầy đủ của bạn, toàn bộ thanh tiến trình được tô màu bằng màu chính của tôi (colorPrimaryDark) mặc dù tiến trình không phải là 100%. Tôi đã thêm thẻ clip dưới @android: id / background, nó đã được sửa, nhưng nền đã biến mất. Giải pháp tạm thời của tôi là xóa mục nền và thêm màu nền vào bố cục (không có góc tròn).
Oğuzhan Koşar

5
Trong trường hợp của tôi, scalevới android:scaleWidth="100%"đã làm thủ thuật để hiển thị nó với các góc tròn. Rất cám ơn
Edison Spencer

1
Cảm ơn. Bạn đã cứu ngày của tôi.
Nguyễn Anh Tuấn

8

Cảm ơn Georgi Koemdzhiev về một câu hỏi và hình ảnh tốt đẹp. Đối với những ai muốn làm tương tự như của mình, hãy làm như sau.

1) Tạo nền cho a ProgressBar.

Progress_bar_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <corners android:radius="3dp" />
    <stroke android:color="@color/white" android:width="1dp" />
</shape>

2) Tạo thang đo cho ProgressBar.

Cong_progress_bar.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="2dp" />
            <solid android:color="@color/transparent" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2dp" />
                <solid android:color="#ffff00" />
            </shape>
        </clip>
    </item>
</layer-list>

3) Trong tệp bố trí, thêm ProgressBar.

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="6dp"
    android:layout_marginStart="20dp"
    android:layout_marginTop="10dp"
    android:layout_marginEnd="20dp"
    android:background="@drawable/progress_bar_background"
    >

    <ProgressBar
        android:id="@+id/progress_bar"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:layout_margin="1dp"
        android:indeterminate="false"
        android:progressDrawable="@drawable/curved_progress_bar"
        />

</FrameLayout>

5

Với Chất liệu Thư viện Linh kiện bạn có thể sử dụng ProgressIndicatorvà các app:indicatorCornerRadiusthuộc tính.
Cái gì đó như:

    <com.google.android.material.progressindicator.ProgressIndicator
        style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
        app:indicatorSize="xxdp"
        app:indicatorCornerRadius="xdp"/>

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

Nó cũng hoạt động cho chỉ báo tiến trình xác định ( style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Determinate").

Lưu ý: nó yêu cầu ít nhất phiên bản 1.3.0-alpha03.


4

Mã tạo ra thanh tiến trình sau
Bạn có thể đạt được thanh tiến trình với cả màu tiến trình bên trong, màu đường viền, tiến trình trống với màu trong suốt.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape>
        <corners android:radius="15dip" />
        <stroke android:width="1dp" android:color="@color/black" />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                android:startColor="@color/black"
                android:centerColor="@color/trans"
                android:centerY="0.75"
                android:endColor="@color/black"
                android:angle="270"

                />
        </shape>
    </clip>
 </item>


 <item
    android:id="@android:id/progress"
    >
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/black"
                android:endColor="@color/black"
                android:angle="270" />
        </shape>
    </clip>
 </item>
 </layer-list>

Chào Ravichandra, cảm ơn câu trả lời của bạn! Bạn có thể thêm lời giải thích tại sao mã của bạn trả lời câu hỏi của anh ấy không? Nếu không, nó sẽ khó sử dụng cho những người dùng khác. Cảm ơn!
Nander Speerstra

Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp hạn chế, tức thì. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc trong tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm cả những giả định bạn đã đưa ra. Hơn nữa, hãy cố gắng giải thích tại sao câu trả lời của bạn tốt hơn các câu trả lời khác đã được đưa ra cho câu hỏi này.
Qw3ry
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.