默认情况下,ProgressBar 在其本身上下有一定的填充。是否有一种方法可以去除这个填充,只保留最终的进度条?
默认情况下,ProgressBar 在其本身上下有一定的填充。是否有一种方法可以去除这个填充,只保留最终的进度条?
我使用以下方法来解决这个问题。
android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"
android:layout_marginTop="-6dp"
对我有用。不知道它是否与设备有关?我只在 Xperia Z1 上进行了测试。 - Thorbjørn Kappel Hansen这是我使用Juozas的答案的方法:
我的ProgressBar
高度为4dp。因此,我创建了一个高度为4dp的FrameLayout
,并将ProgressBar
的layout_gravity
设置为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>
注意:一个FrameLayout
的作用是裁剪掉多余的部分,如果你遇到ProgressBar
仍然很窄的问题,只需将ProgressBar
的layout_height
设置为一些较大的数字,如100dp
。它将完全覆盖FrameLayout,并且只会显示其4dp
。
如果有人仍需要帮助,可以尝试这个:
<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属性应用于同一元素(在本例中,是guideline)。
<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>
我最终使用了自定义库来解决这个问题。大多数其他解决方案都能起作用,但结果在各种设备上不一致。
MaterialProgressBar
- 在 Android 4.0 及以上版本中外观一致。
- 在不同平台上正确着色。
- 能够去除框架 ProgressBar 的内在填充。
- 能够隐藏框架水平 ProgressBar 的轨道。
- 可用作框架 ProgressBar 的替代品。
要添加 gradle 依赖项:
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页面。
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progress_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
android:indeterminate="true"
app:indicatorColor="@color/colorAccent"
app:layout_constraintTop_toBottomOf="@+id/app_bar_pdfview"/>
我正在使用这个新进度条。
implementation 'com.google.android.material:material:1.3.0'
在父元素中绘制垂直居中的进度条,可以将其剪裁掉填充区域。由于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>
以下是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" />
</animation-list>
样式资源已复制到我的本地样式文件。
<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" />
<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi/
。 - C--在使用水平样式的进度条(progressbar)时,我遇到了同样的问题。
根本原因是进度条的默认9-patch可绘制资源(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"/>
一个技巧是给进度条添加负边距。
以下是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" />
maxHeight
无效。 - abergmeierandroid:minHeight="4dp"
- Sam Chen