Secara default ProgressBar memiliki padding tertentu di atas dan di bawah bar itu sendiri. Apakah ada cara untuk menghapus bantalan ini sehingga hanya memiliki bilah pada akhirnya?
android:minHeight="4dp"
Secara default ProgressBar memiliki padding tertentu di atas dan di bawah bar itu sendiri. Apakah ada cara untuk menghapus bantalan ini sehingga hanya memiliki bilah pada akhirnya?
android:minHeight="4dp"
Jawaban:
Saya menggunakan berikut ini sebagai solusi untuk masalah ini.
android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"
android:layout_marginTop="-6dp"
bekerja untuk saya. Bertanya-tanya apakah itu tergantung pada perangkat? Saya hanya menguji Xperia Z1
Framelayout
(seperti dalam jawaban ini adalah solusi yang lebih baik dan tidak tergantung pada ukuran / jenis ponsel / versi os
Beginilah cara saya menggunakan jawaban Juozas:
ketinggian saya ProgressBar
adalah 4dp. Jadi saya membuat FrameLayout
dengan tinggi 4dp dan mengatur layout_gravity
dari ProgressBar
ke center
. Ini bekerja seperti pesona.
<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>
Saya akhirnya menggunakan perpustakaan khusus untuk menyelesaikan masalah ini. Sebagian besar solusi lain berfungsi tetapi hasilnya tidak konsisten di berbagai perangkat.
MaterialProgressBar
- Penampilan yang konsisten di Android 4.0+.
- Memperbaiki tinting di seluruh platform.
- Mampu menghapus bantalan intrinsik kerangka ProgressBar.
- Mampu menyembunyikan jejak kerangka ProgressBar horizontal.
- Digunakan sebagai pengganti drop-in untuk kerangka ProgressBar.
Untuk menambahkan sebagai ketergantungan gradle:
compile 'me.zhanghai.android.materialprogressbar:library:1.1.7'
Untuk menambahkan ProgressBar tanpa padding intrinsik ke tata letak Anda:
<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"
melakukan triknya. Untuk lebih jelasnya lihat halaman GitHub .
Jika seseorang masih membutuhkan bantuan dapat mencoba ini:
<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" />
Di sini, progress bar adalah dalam ConstraintLayout , dan constraintTop_toTopOf dan constraintBottom_toTopOf atribut harus diterapkan untuk unsur yang sama (dalam hal ini, itu adalah pedoman).
*** SOLUSI LENGKAP: ***
<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>
Dimungkinkan untuk menggambar ProgressBar yang berpusat secara vertikal di dalam induk yang akan memotong padding. Karena ProgressBar tidak dapat menggambar dirinya lebih besar dari induk, kita harus membuat induk besar untuk ditempatkan di dalam tampilan kliping.
<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>
Untuk menghilangkan vertial padding ProgressBar
dapat dilakukan dengan cara
ProgressBar
Contoh berisi 1 wrap_content ProgressBar
, 1 8dp ProgressBar
, 1 100dpProgressBar
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
...
android:layout_height="8dp"
android:scaleY="2" />
Solusi lengkap untuk masalah ini adalah sebagai berikut. Untuk berjaga-jaga jika seseorang membutuhkan fragmen kode, inilah yang saya lakukan.
Ini adalah 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" />
Sumber daya gaya disalin ke file gaya lokal saya.
<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>
Dan terakhir, setel tinggi min menjadi 4dp di file tata letak lokal saya.
<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" />
<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi/
Saya menemui masalah yang sama saat menggunakan progressbar dengan gaya Horizontal.
Akar penyebabnya adalah 9-patch drawable default untuk progress bar: (progress_bg_holo_dark.9.png) memiliki beberapa piksel transparan vertikal sebagai padding.
Solusi terakhir yang berhasil untuk saya: sesuaikan kemajuan drawable, kode sampel saya sebagai berikut:
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>
cuplikan tata letak:
<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"/>
Salah satu triknya adalah menambahkan margin negatif ke bilah kemajuan Anda.
Di bawah ini adalah contoh kode XML, dengan asumsi itu ada di atas layar Anda:
<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" />
Jawaban Subin tampaknya menjadi satu-satunya (saat ini) yang bukan merupakan subjek peretasan rapuh yang akan rusak dalam rilis Android ProgressBar di masa mendatang.
Tetapi daripada mengalami kesulitan memecah sumber daya, memodifikasinya, dan mempertahankannya tanpa batas, saya memilih untuk menggunakan pustaka MaterialProgressBar , yang melakukannya untuk kita:
<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"
/>
Dalam build.gradle:
// Android horizontal ProgressBar doesn't allow removal of top/bottom padding
compile 'me.zhanghai.android.materialprogressbar:library:1.1.6'
Proyek itu memiliki demo bagus yang menunjukkan perbedaan antara itu dan ProgressBar bawaan.
jika seseorang masih mencari solusi - periksa komentar ini
atur tinggi minimum menjadi 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" />
Saya menggunakan minHeight dan maxHeigh. Ini membantu untuk versi Api yang berbeda.
<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" />
Ini perlu menggunakan keduanya. Api 23 bekerja dengan baik
android:layout_height="wrap_content"
android:minHeight="0dp"
Tetapi versi Api yang lebih rendah meningkatkan tinggi bilah kemajuan ke maxHeight dalam kasus itu.
Coba yang berikut ini:
<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" />
... lalu konfigurasikan bilah kemajuan sesuai kebutuhan Anda karena pada awalnya akan menampilkan bilah berukuran sedang dengan warna kemajuan berwarna kuning dengan warna latar belakang kemajuan keabu-abuan. Juga, perhatikan bahwa tidak ada bantalan vertikal.
Gunakan seperti ini, di dalam 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>
menambahkan android: progressDrawable ke daftar lapisan yang ditentukan di drawable memperbaiki masalah saya. Ia bekerja dengan menutupi bilah proses dalam drawable khusus
contoh implementasi dijelaskan di https://stackoverflow.com/a/4454450/1145905
Saya menggunakan style="@style/Widget.AppCompat.ProgressBar.Horizontal"
dan cukup mudah untuk menghilangkan margin. Gaya itu adalah:
<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>
Saya baru saja mengesampingkan tinggi min / maks:
<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" />
Tidak perlu mengunduh modul baru atau bahkan meletakkan FrameLayout di sekitar Progress Bar. Ini semua hanyalah retasan. Hanya 2 langkah:
Di apapun.xml Anda
<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, Ubah nilainya sesuka Anda.
Tidak suka sudut membulat?
Hapus radius sudut
Tidak suka warnanya? Ubah warna, dll. Selesai!
<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>
Umumnya, ini adalah langkah-langkah untuk mengubah kode apa pun yang tidak Anda sukai. Temukan saja kode sumbernya dan cari tahu apa yang harus diubah. Jika Anda mengikuti kode sumber ProgressBar, Anda akan menemukan file bernama progress_horizontal.xml yang direferensikan. Pada dasarnya bagaimana saya menyelesaikan semua masalah XML saya.
<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" />
<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"/>
Gunakan saja Material ProgressIndicator yang tidak memiliki margin tersembunyi.
<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" />
Solusi tanpa trik sederhana yang kompatibel dengan versi Android apa pun dan tidak memerlukan pustaka eksternal adalah memalsukan ProgressBar
dua Views
di dalamnya LinearLayout
. Inilah yang akhirnya saya dapatkan. Terlihat cukup rapi dan pendekatan ini cukup fleksibel - Anda dapat menganimasikannya dengan cara yang funky, menambahkan teks, dll.
Tata Letak:
<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>
Kode:
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);
}
Hasil (dengan beberapa ketinggian ditambahkan):
Solusi terbaik seharusnya
android:minHeight="0dp"
Tidak ada solusi dan berfungsi seperti pesona.
minHeight
yang lebih besar dari 0 (katakanlah 32dp mungkin) yang telah ditentukan sebelumnya. Dengan mengubah properti ini, Anda mendapatkan tampilan yang berbeda.
maxHeight
, tidak berfungsi.