ลบช่องว่างแนวตั้งออกจาก ProgressBar แนวนอน


127

ตามค่าเริ่มต้น ProgressBar จะมีช่องว่างด้านบนและด้านล่างของแถบ มีวิธีลบช่องว่างภายในนี้เพื่อให้มีแถบปิดท้ายเท่านั้นหรือไม่?


7
ตามที่ระบุไว้ในหัวข้ออื่นการตั้งค่าmaxHeightไม่ทำงาน
abergmeier

android:minHeight="4dp"
Sam Chen

คำตอบ:


72

ฉันใช้สิ่งต่อไปนี้เป็นวิธีแก้ปัญหาสำหรับปัญหานี้

android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"

1
ฉันไม่ต้องการ layout_marginBottom
AlikElzin-kilaka

11
android:layout_marginTop="-6dp"ทำงานให้ฉัน สงสัยว่ามันขึ้นอยู่กับอุปกรณ์หรือไม่? ฉันได้ทดสอบกับ Xperia Z1
Thorbjørn Kappel Hansen

2
@ ThorbjørnKappelHansenขึ้นอยู่กับอุปกรณ์ Galaxy S6 และขอบด้านบนของ -6dp ไม่ทำงานตามที่ต้องการ
มูฮัมหมัดอับดุลราฮิม

1
ฉันคิดว่าระยะขอบจะขึ้นอยู่กับขนาดของแถบความคืบหน้าและเวอร์ชันของ Android
Noel

2
โดยใช้Framelayout(เช่นในคำตอบนี้เป็นทางออกที่ดีกว่าและไม่ขึ้นอยู่กับขนาดโทรศัพท์ / ประเภท / เวอร์ชันของระบบปฏิบัติการ
koceeng

57

นี่คือวิธีที่ฉันใช้คำตอบของ Juozas:

ความสูงของฉันProgressBarคือ 4dp ดังนั้นผมจึงสร้างFrameLayoutมีความสูง 4DP และการตั้งค่าlayout_gravityของการProgressBar centerมันใช้งานได้เหมือนมีเสน่ห์

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="4dp">

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:layout_gravity="center"
        android:indeterminate="true"/>

</FrameLayout>

23
นี่เป็นความคิดที่ดี แต่รหัสของคุณใช้ไม่ได้สำหรับฉันใน Android 7.0 โดยใช้แถบความคืบหน้าของไลบรารีการสนับสนุน แถบเริ่มบางลง แต่ยังคงมีช่องว่างที่ด้านบน
แซม

4
@ แซมเพียงแค่สร้าง ProgressBar เช่น height = 100dp เนื่องจาก FrameLayout ยังคงเป็น 4dp แต่แถบจะดูหนาขึ้น
Megaetron

5
ไม่ทำงานบน API 24+ แถบจะบางลงไม่ว่าเราจะกำหนดขนาดไว้เท่าใดก็ตาม
Mauker

36

ฉันลงเอยด้วยการใช้ไลบรารีที่กำหนดเองเพื่อแก้ปัญหานี้ โซลูชันอื่น ๆ ส่วนใหญ่ใช้ได้ผล แต่ผลลัพธ์ไม่สอดคล้องกันในอุปกรณ์ต่างๆ

MaterialProgressBar

  • รูปลักษณ์ที่สอดคล้องกันบน Android 4.0+
  • แก้ไขการย้อมสีข้ามแพลตฟอร์ม
  • สามารถลบช่องว่างภายในของกรอบ ProgressBar
  • สามารถซ่อนแทร็กของกรอบแนวนอน ProgressBar
  • ใช้แทนดรอปอินสำหรับเฟรมเวิร์ก ProgressBar

ในการเพิ่มการพึ่งพาการไล่ระดับสี:

compile 'me.zhanghai.android.materialprogressbar:library:1.1.7'

ในการเพิ่ม ProgressBar โดยไม่มีช่องว่างภายในให้กับเค้าโครงของคุณ:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar
    android:layout_width="wrap_content"
    android:layout_height="4dp"
    android:indeterminate="true"
    app:mpb_progressStyle="horizontal"
    app:mpb_useIntrinsicPadding="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal" />

app:mpb_useIntrinsicPadding="false"เคล็ดลับไม่ สำหรับรายละเอียดเพิ่มเติมโปรดดูที่หน้า GitHub


ก่อนอื่นฉันพยายามหลีกเลี่ยงที่จะเพิ่มการพึ่งพาอื่นเพื่อลบช่องว่างบางส่วนออก แต่วิธีแก้ปัญหาอื่น ๆ ทั้งหมดล้มเหลวในทางใดทางหนึ่ง / เวอร์ชันและในที่สุดก็ใช้เวลา 3 นาทีในการทำงาน !! ขอบคุณ.
ToniTornado

32
ไลบรารีทั้งหมดเพียงเพื่อแก้ไขช่องว่างในมุมมอง วิธีไป Google
Denny

คุณอาจต้องการใช้ @ style / Widget.AppCompat.ProgressBar.Horizontal สำหรับข้างต้น (ขึ้นอยู่กับการตั้งค่าของคุณ)
.

32

หากยังมีใครต้องการความช่วยเหลือสามารถลองทำสิ่งนี้:

<androidx.core.widget.ContentLoadingProgressBar
    android:id="@+id/progress"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="@+id/guideline"
    android:indeterminate="true"
    android:visibility="visible"
    app:layout_constraintBottom_toTopOf="@+id/guideline" />

ที่นี่แถบความคืบหน้าจะอยู่ภายในConstraintLayoutและconstraintTop_toTopOfและconstraintBottom_toTopOfคุณลักษณะที่จะต้องนำไปใช้กับองค์ประกอบเดียวกัน (ในกรณีนี้มันเป็นแนวทาง)

*** วิธีแก้ปัญหาที่สมบูรณ์: ***

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="48dp">

<View
    android:id="@+id/guideline"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="vertical"
    android:visibility="invisible"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<ProgressBar
    android:id="@+id/progress_bar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    app:layout_constraintBottom_toTopOf="@+id/guideline"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/guideline" />
</androidx.constraintlayout.widget.ConstraintLayout>

5
ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องเนื่องจากทำงานได้อย่างสมบูรณ์!
Philio

1
นี่คือคำตอบที่ใช่! คุณเข้ากันได้กับอุปกรณ์ทั้งหมด (ซึ่งไม่มีให้เป็นขอบลบ) และเวอร์ชัน Android (ซึ่งไม่ได้จัดเตรียมโดยโซลูชันเค้าโครงเฟรม) นอกจากนี้คุณไม่จำเป็นต้องทำงานทั้งหมดที่จำเป็นโดยการนำเข้าสิ่งที่วาดได้ของระบบไปยังแอพ (ซึ่งไม่มี UI ที่สอดคล้องกันในระบบสำหรับ Android ทุกรุ่น)
Vaios

2
@Ali_Waris ขอบคุณสำหรับการโพสต์คำตอบฉันกระตือรือร้นที่จะเข้าใจวิธีแก้ปัญหานี้เนื่องจากไม่สามารถทำงานได้ คุณช่วยขยายคำตอบเพื่อรวม ConstraintLayout และแนวทางในคำตอบได้หรือไม่
scottyab

แนวทางที่นี่คืออะไร? มันจะไปไหน?
iamgopal

แทนที่จะใช้ guidline คุณสามารถใช้มุมมองที่ว่างเปล่าได้ : orientation = "vertical" android: visibility = "visible "app: layout_constraintBottom_toBottomOf =" parent "/>
Kochchy

16

เป็นไปได้ที่จะวาด ProgressBar ที่อยู่ตรงกลางในแนวตั้งภายในพาเรนต์ซึ่งจะตัดช่องว่างภายในออกไป เนื่องจาก ProgressBar ไม่สามารถวาดตัวเองให้ใหญ่กว่าพาเรนต์ได้เราจึงต้องสร้างพาเรนต์ขนาดใหญ่เพื่อวางไว้ในมุมมองการตัด

<FrameLayout
    android:id="@+id/clippedProgressBar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    tools:ignore="UselessParent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="16dp"
        android:layout_gravity="center_vertical">

        <ProgressBar
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:indeterminate="true"/>

    </FrameLayout>

</FrameLayout>

1
สิ่งนี้ใช้ได้กับ Android 7.0 แต่ส่งผลให้ไม่มีแถบความคืบหน้าบน Sony Xperia M ที่ใช้ Android 4.1.2
แซม

@Sam ขอบคุณสำหรับการรายงาน! คุณจะเห็นอะไรหากคุณเปลี่ยนความสูงของ FrameLayout แรกจาก 4dp เป็น 48dp
Juozas Kontvainis

แถบความคืบหน้าจะปรากฏขึ้น แต่มีช่องว่างภายในจำนวนมากและมีช่องว่างด้านบนเล็กน้อย
แซม

@ แซมฉันได้อัปเดตคำตอบแล้วหวังว่าจะใช้งานได้บนอุปกรณ์ Sony ของคุณ หากไม่ได้ผลฉันขอแนะนำให้ตรวจสอบการกำหนดค่าธีมแอปพลิเคชันของคุณ การใช้ธีม Holo บน KitKat ควรแก้ไขได้
Juozas Kontvainis

15

หากต้องการลบช่องว่างในแนวตั้งProgressBarคุณสามารถทำได้โดย

  • แก้ไขความสูงของ ProgressBar
  • ใช้ scaleY = "value" (value = height / 4) (4 คือความสูงเริ่มต้นของแถบความคืบหน้า)

ตัวอย่างประกอบด้วย 1 wrap_content ProgressBar, 1 8dp ProgressBar, 1 100dpProgressBar

ใส่คำอธิบายภาพที่นี่

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    ...
    android:layout_height="8dp"
    android:scaleY="2" />

14

วิธีแก้ปัญหาที่สมบูรณ์สำหรับปัญหานี้จะเป็นดังนี้ ในกรณีที่มีคนต้องการเศษรหัสนี่คือสิ่งที่ฉันทำ

  1. คัดลอกแถบเลื่อนแถบความคืบหน้าแนวนอนที่ไม่ระบุทั้งหมด 8 รายการ
  2. แก้ไขสิ่งที่วาดได้โดยใช้โปรแกรมปรับแต่งภาพและลบพายที่ไม่จำเป็นออก
  3. คัดลอก XML ที่วาดได้ชื่อ progress_indeterminate_horizontal_holo.xml จากแพลตฟอร์ม Android
  4. คัดลอกสไตล์ Widget.ProgressBar.Horizontal และผู้ปกครอง
  5. ตั้งค่าสไตล์และ min_height ด้วยตนเองในเค้าโครง

นี่คือ progress_indeterminate_horizontal_holo.xml

<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
<item android:drawable="@drawable/progressbar_indeterminate_holo1" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo2" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo3" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo4" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo5" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo6" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo7" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo8" android:duration="50" />

ทรัพยากรรูปแบบคัดลอกไปยังไฟล์สไตล์ในเครื่องของฉัน

<style name="Widget">
    <item name="android:textAppearance">@android:attr/textAppearance</item>
</style>

<style name="Widget.ProgressBar">
    <item name="android:indeterminateOnly">true</item>
    <item name="android:indeterminateBehavior">repeat</item>
    <item name="android:indeterminateDuration">3500</item>
</style>

<style name="Widget.ProgressBar.Horizontal">
    <item name="android:indeterminateOnly">false</item>
    <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_holo</item>
</style>

และสุดท้ายตั้งค่าความสูงขั้นต่ำเป็น 4dp ในไฟล์เลย์เอาต์ในเครื่องของฉัน

<ProgressBar
    android:id="@+id/pb_loading"
    style="@style/Widget.ProgressBar.Horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:indeterminate="true"
    android:minHeight="4dp"
    android:minWidth="48dp"
    android:progressDrawable="@drawable/progress_indeterminate_horizontal_holo" />

เราจะคัดลอก drawable ที่กล่าวถึงในขั้นตอนที่ 1 ได้จากที่ใด: "1. คัดลอกแถบความคืบหน้าแนวนอนที่ไม่ทราบแน่ชัดทั้ง 8 รายการ"
Greenhand

3
@JeffreyLin ฉันคัดลอกมาจากสถานที่นี้<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi/
Subin Sebastian

33
ไม่น่าแปลกใจที่คุณต้องทำงานมากแค่ไหนเพื่อให้บรรลุพฤติกรรมสามัญสำนึกที่ควรจะมาโดยค่าเริ่มต้นใน Android?
SpaceMonkey

1
และสำหรับการออกแบบวัสดุ?
mrroboaat

@aat ฉันไม่คิดว่าหลักเกณฑ์วัสดุมีแถบความคืบหน้าคล้ายกัน โปรดอ่านเอกสารนี้: google.com/design/spec/components/…
Subin Sebastian

10

ฉันพบปัญหาเดียวกันขณะใช้แถบความคืบหน้ากับสไตล์แนวนอน

สาเหตุที่แท้จริงคือ 9 แพตช์เริ่มต้นที่วาดได้สำหรับแถบความคืบหน้า: (progress_bg_holo_dark.9.png) มีพิกเซลโปร่งใสในแนวตั้งเป็นช่องว่างภายใน

โซลูชันสุดท้ายที่ใช้ได้ผลสำหรับฉัน: ปรับแต่งความคืบหน้าที่วาดได้โค้ดตัวอย่างของฉันดังต่อไปนี้:

custom_horizontal_progressbar_drawable.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 android:shape="rectangle">
            <solid android:color="#33ffffff" />
        </shape>
    </item>
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="#ff9800" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="#E91E63" />
            </shape>
        </clip>
    </item>
</layer-list>

ตัวอย่างเค้าโครง:

<ProgressBar
    android:id="@+id/song_progress_normal"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:layout_alignParentBottom="true"
    android:progressDrawable="@drawable/custom_horizontal_progressbar_drawable"
    android:progress="0"/>

นี่น่าจะเป็นทางออกที่ดีที่สุด โค้ดตัวอย่างของคุณไม่มีแถบความคืบหน้าบน Sony Xperia M ที่ใช้ Android 4.1.2
แซม

8

เคล็ดลับอย่างหนึ่งคือการเพิ่มระยะขอบลบในแถบความคืบหน้าของคุณ

ด้านล่างนี้เป็นตัวอย่างของโค้ด XML โดยสมมติว่าอยู่ด้านบนของหน้าจอของคุณ:

<ProgressBar
    android:id="@+id/progressBar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-7dp"
    android:layout_marginBottom="-7dp"
    android:indeterminate="true" />

ผลลัพธ์ของรหัส


การเพิ่มระยะขอบลบช่วยแก้ปัญหาให้ฉันได้ ขอบคุณ!
icarovirtual

5

คำตอบของ Subin ดูเหมือนจะเป็นคำตอบเดียว (ในปัจจุบัน) ที่ไม่ใช่การแฮ็กที่เปราะบางซึ่งอาจทำให้เกิดความเสียหายในอนาคตของ Android ProgressBar

แต่แทนที่จะต้องเผชิญกับปัญหาในการทำลายทรัพยากรออกแก้ไขและบำรุงรักษาอย่างไม่มีกำหนดฉันเลือกที่จะใช้ไลบรารี MaterialProgressBarซึ่งทำเพื่อเรา:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    android:layout_gravity="bottom"
    custom:mpb_progressStyle="horizontal"
    custom:mpb_showTrack="false"
    custom:mpb_useIntrinsicPadding="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal.NoPadding"
/>

ใน build.gradle:

// Android horizontal ProgressBar doesn't allow removal of top/bottom padding
compile 'me.zhanghai.android.materialprogressbar:library:1.1.6'

โครงการนั้นมีการสาธิตที่ดีที่แสดงความแตกต่างระหว่างโปรเจ็กต์และ ProgressBar ในตัว


4

หากยังมีคนค้นหาวิธีแก้ปัญหา - ตรวจสอบความคิดเห็น

ตั้งค่าความสูงต่ำสุดเป็น4 dp

   android:minHeight="4dp"

-

  <ProgressBar
    android:id="@+id/web_view_progress_bar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:max="100"
    android:min="0"
    android:progress="5"
    android:minHeight="4dp"
    android:progressTint="@color/vodafone_red"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:progress="60" />

ฉันชอบคำตอบนี้
Sam Chen

2

ฉันใช้ minHeight และ maxHeigh ช่วยสำหรับเวอร์ชัน Api ที่แตกต่างกัน

<ProgressBar
    android:id="@+id/progress_bar"
    style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxHeight="3dp"
    android:minHeight="3dp" />

จำเป็นต้องใช้ทั้งสองอย่าง Api 23 ใช้งานได้ดีกับ

android:layout_height="wrap_content"
android:minHeight="0dp"

แต่เวอร์ชัน Api ที่ต่ำกว่าจะเพิ่มความสูงของแถบความคืบหน้าเป็น maxHeight ในกรณีนั้น


2

ลองทำดังต่อไปนี้:

<ProgressBar
    android:id="@+id/progress_bar"
    style="@android:style/Widget.ProgressBar.Horizontal"
    android:progress="25"
    android:progressTint="@color/colorWhite"
    android:progressBackgroundTint="@color/colorPrimaryLight"
    android:layout_width="match_parent"
    android:layout_height="4dp" />

... จากนั้นกำหนดค่าแถบความคืบหน้าตามความต้องการของคุณเนื่องจากในตอนแรกจะแสดงแถบขนาดกลางที่มีสีความคืบหน้าสีเหลืองพร้อมกับสีพื้นหลังความคืบหน้าสีเทา นอกจากนี้โปรดสังเกตว่าไม่มีช่องว่างในแนวตั้ง


2

ใช้แบบนี้ภายใน Linearlayout

 <LinearLayout
        android:layout_width="match_parent"
        android:background="#efefef"
        android:layout_height="wrap_content">

        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:indeterminate="true"
            android:visibility="gone"
            android:layout_marginTop="-7dp"
            android:layout_marginBottom="-7dp"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            />

    </LinearLayout>

ใช้งานได้ดี! ครั้งต่อไปให้อธิบายว่าโค้ดของคุณทำอะไรและคุณเปลี่ยนแปลงอะไรบ้าง ;-)
พัฒนาจาก Jokela

1

การเพิ่ม android: progressDrawable ไปยังรายการเลเยอร์ที่กำหนดไว้ใน drawable ได้แก้ไขปัญหาให้ฉัน ทำงานโดยการกำบังแถบ progess ในแบบ drawable ที่กำหนดเอง

ตัวอย่างการใช้งานที่อธิบายไว้ที่https://stackoverflow.com/a/4454450/1145905


1

ฉันใช้style="@style/Widget.AppCompat.ProgressBar.Horizontal"และมันค่อนข้างง่ายที่จะกำจัดระยะขอบ สไตล์นั้นคือ:

    <item name="progressDrawable">@drawable/progress_horizontal_material</item>
    <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material</item>
    <item name="minHeight">16dip</item>
    <item name="maxHeight">16dip</item>

ฉันเพิ่งลบล้างความสูงต่ำสุด / สูงสุด:

    <ProgressBar
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:indeterminate="true"
        android:minHeight="2dp"
        android:maxHeight="2dp" />

ฉันไม่เคยพอใจกับแถบความคืบหน้าทั่วไปและหันไปใช้ห้องสมุดในที่สุด: me.zhanghai.android.materialprogressbar.MaterialProgressBar
Anthony

1

ไม่จำเป็นต้องดาวน์โหลดโมดูลใหม่หรือแม้แต่ใส่ FrameLayout รอบ Progress Bar ของคุณ ทั้งหมดนี้เป็นเพียงการแฮ็ก เพียง 2 ขั้นตอน:

ใน what.xml ของคุณ

<ProgressBar
    android:id="@+id/workoutSessionGlobalProgress"
    android:layout_width="match_parent"
    android:layout_height="YOUR_HEIGHT"
    android:progressDrawable="@drawable/progress_horizontal"
    android:progress="0"
    <!-- High value to make ValueAnimator smoother -->
    android:max="DURATION * 1000"
    android:indeterminate="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"/>

progress_horizontal.xml เปลี่ยนค่าตามที่คุณต้องการ

ไม่ชอบมุมโค้งมน?
ลบรัศมีมุม

ไม่ชอบสี? เปลี่ยนสี ฯลฯ เสร็จแล้ว!

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
                    />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#80ffd300"
                        android:centerColor="#80ffb600"
                        android:centerY="0.75"
                        android:endColor="#a0ffcb00"
                        android:angle="270"
                        />
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"
                        />
            </shape>
        </clip>
    </item>

</layer-list>

โดยทั่วไปนี่เป็นขั้นตอนในการเปลี่ยนรหัสของสิ่งที่คุณไม่ชอบ เพียงแค่ค้นหาซอร์สโค้ดและค้นหาสิ่งที่ต้องเปลี่ยนแปลง หากคุณทำตามซอร์สโค้ด ProgressBar คุณจะพบไฟล์ชื่อ progress_horizontal.xml ซึ่งอ้างอิงถึง โดยทั่วไปฉันจะแก้ปัญหา XML ทั้งหมดของฉันได้อย่างไร


0
 <ProgressBar
        android:layout_marginTop="-8dp"
        android:layout_marginLeft="-8dp"
        android:layout_marginRight="-8dp"
        android:id="@+id/progress_bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:indeterminate="false"
        android:indeterminateTint="@color/white"
        android:max="100"
        android:paddingStart="8dp"
        android:paddingRight="0dp"
        android:progressDrawable="@drawable/progress_bg" />

0
<androidx.core.widget.ContentLoadingProgressBar
                    android:id="@+id/progressBar"
                    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:indeterminate="true"
                    android:paddingTop="2dp"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintBottom_toTopOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"/>

กรุณาอย่าเพิ่งโพสต์รหัส ให้บริบทกับคำตอบของคุณ
Martin Gal

0

เพียงแค่ใช้ Material ProgressIndicator ซึ่งไม่มีขอบซ่อนอยู่

<com.google.android.material.progressindicator.ProgressIndicator
        android:id="@+id/progressBar"
        style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:indicatorColor="@color/colorPrimary"
        app:trackColor="@color/colorAccent" />

-1

วิธีแก้ปัญหาง่ายๆที่เข้ากันได้กับ Android เวอร์ชันใดก็ได้และไม่จำเป็นต้องมีไลบรารีภายนอกที่แกล้งทำเป็นProgressBarสองอันViewsภายในLinearLayoutภายในนี่คือสิ่งที่ฉันลงเอยด้วย ดูเรียบร้อยและวิธีนี้ค่อนข้างยืดหยุ่น - คุณสามารถทำให้เคลื่อนไหวได้ในรูปแบบที่ขี้ขลาดเพิ่มข้อความและอื่น ๆ

เค้าโครง:

<LinearLayout
    android:id="@+id/inventory_progress_layout"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/inventory_progress_value"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/inventory_progress_remaining"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

รหัส:

public void setProgressValue(float percentage) {
    TextView progressValue = (TextView) findViewById(R.id.inventory_progress_value);
    TextView progressRemaining = (TextView) findViewById(R.id.inventory_progress_remaining);

    LinearLayout.LayoutParams paramsValue = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    LinearLayout.LayoutParams paramsRemaining = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    paramsValue.weight = (100 - percentage);
    paramsRemaining.weight = percentage;

    progressValue.setLayoutParams(paramsValue);
    progressRemaining.setLayoutParams(paramsRemaining);

}

ผลลัพธ์ (มีการเพิ่มระดับความสูง):

ใส่คำอธิบายภาพที่นี่


-1

ทางออกที่ดีที่สุดควรเป็น

android:minHeight="0dp"

ไม่มีวิธีแก้ปัญหาและใช้งานได้อย่างมีเสน่ห์


ไม่ได้ผลคุณช่วยอธิบายได้ไหมว่าทำไมถึงได้ผล
humble_wolf

@humble_wolf มันใช้ได้ผลกับตัวเองในโครงการก่อนหน้าของฉันตอนที่ฉันเขียนคำตอบ อาจขึ้นอยู่กับไลบรารีบางรุ่นหรือไม่ ควรใช้งานได้เนื่องจากเหตุผลที่มีช่องว่างภายในเช่นแถบความคืบหน้าไม่ใช่ช่องว่างภายในจริง แต่มีช่องว่างminHeightที่ใหญ่กว่า 0 (อาจเป็น 32dp) ที่กำหนดไว้ล่วงหน้า โดยการเปลี่ยนคุณสมบัตินี้คุณจะได้รูปลักษณ์ที่แตกต่างออกไป
Alex Fan

ไม่ได้ผลสำหรับฉันในโหมด Inderminate = true อาจทำงานในโหมดกำหนด หากคุณต้องการให้คำตอบนี้เป็นคำตอบจริงๆโปรดเขียนคำอธิบายพร้อมกับเงื่อนไขทั้งหมด
humble_wolf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.