从水平ProgressBar中删除垂直填充

abe*_*ier 114 android android-progressbar

默认情况下,ProgressBar在条形本身的上方和下方都有一定的填充.有没有办法删除这个填充,以便只有最后的栏?

Ste*_*Wan 66

我使用以下作为此问题的解决方法.

android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"
Run Code Online (Sandbox Code Playgroud)

  • `android:layout_marginTop =" - 6dp"`为我工作.不知道它是否依赖于设备?我只在Xperia Z1上测试过 (9认同)
  • @ThorbjørnKappelHansen它取决于设备.Galaxy S6和-6dp的上限不能按预期工作. (2认同)
  • 使用`Framelayout`(如[这个答案](http://stackoverflow.com/a/36264357/4112725)是更好的解决方案,不依赖于手机尺寸/类型/操作系统版本) (2认同)

pen*_*Dev 53

这就是我使用Juozas的答案:

我的身高ProgressBar是4dp.所以,我创建了一个FrameLayout具有高度4DP和设定layout_gravityProgressBarcenter.它就像一个魅力.

<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>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个好主意,但您的代码在Android 7.0上使用支持库进度条对我不起作用.酒吧变得更薄,但顶部仍然有填充物. (22认同)
  • 这比使用`margin:-Xdp`更好的解决方法 (4认同)
  • 不适用于API 24+.无论我们设置的尺寸如何,酒吧都会变瘦. (4认同)
  • @Sam只需制作ProgressBar,例如height = 100dp.由于FrameLayout它仍然保持4dp但条形看起来更厚. (3认同)

Bin*_*abu 33

我最终使用自定义库来解决此问题.大多数其他解决方案都有效,但各种设备的结果并不一致.

MaterialProgressBar

  • 在Android 4.0+上保持一致的外观.
  • 跨平台校正着色.
  • 能够删除框架ProgressBar的内在填充.
  • 能够隐藏框架水平ProgressBar的轨道.
  • 用作框架ProgressBar的替代品.

要添加为gradle依赖项:

compile 'me.zhanghai.android.materialprogressbar:library:1.1.7'
Run Code Online (Sandbox Code Playgroud)

要在布局中添加没有内在填充的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" />
Run Code Online (Sandbox Code Playgroud)

app:mpb_useIntrinsicPadding="false"诀窍.有关更多详细信息,请参阅GitHub页面.

  • 整个库只是为了修复视图上的填充.去谷歌的方式. (24认同)

Juo*_*nis 15

可以在父级内部绘制垂直居中的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>
Run Code Online (Sandbox Code Playgroud)


Sub*_*ian 14

该问题的完整解决方案如下.如果有人需要代码片段,这就是我所做的.

  1. 复制了所有8个不确定的水平进度条抽屉
  2. 使用一些图像操纵器编辑drawables并删除不必要的填充
  3. 从android平台复制名为progress_indeterminate_horizo​​ntal_holo.xml的可绘制XML
  4. 复制样式Widget.ProgressBar.Horizo​​ntal及其父级
  5. 在布局中手动设置样式和min_height

这是progress_indeterminate_horizo​​ntal_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" />
Run Code Online (Sandbox Code Playgroud)

样式资源复制到我的本地样式文件.

<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>
Run Code Online (Sandbox Code Playgroud)

最后,在我的本地布局文件中将min height设置为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" />
Run Code Online (Sandbox Code Playgroud)

  • 难道你需要做多少工作才能实现Android中默认出现的常识性行为? (31认同)
  • @JeffreyLin我从这个位置复制了它`<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi /` (3认同)

Ali*_*ris 14

如果仍然需要帮助,可以尝试以下操作:

<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"/>
Run Code Online (Sandbox Code Playgroud)

在这里,进度条位于ConstraintLayout内,必须将constraintTop_toTopOfconstraintBottom_toTopOf属性应用于同一元素(在本例中,这是指导原则)。

  • 这应该被标记为正确答案,因为它可以完美地工作! (2认同)
  • 这是正确的答案!您兼容所有设备(不提供负边距)和 Android 版本(框架布局解决方案不提供)。此外,您不必通过将系统可绘制对象导入到应用程序(这不会为所有 Android 版本提供跨系统的一致 UI)来完成所需的所有工作。 (2认同)
  • @Ali_Waris 感谢您发布答案,我很想理解这个解决方案无法使其正常工作。您能否扩展答案以包括 ConstraintLayout 和答案指南? (2认同)

小智 8

在使用带有水平样式的进度栏时遇到了相同的问题。

根本原因是进度栏的默认9色可绘制图形:(progress_bg_holo_dark.9.png)具有一些垂直的透明像素作为填充。

对我有用的最终解决方案:自定义进度可绘制对象,我的示例代码如下:

custom_horizo​​ntal_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>
Run Code Online (Sandbox Code Playgroud)

布局代码段:

<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"/>
Run Code Online (Sandbox Code Playgroud)


小智 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" />
Run Code Online (Sandbox Code Playgroud)

代码结果


Pha*_*inh 7

要删除的垂直填充ProgressBar,您可以通过

  • 固定高度 ProgressBar
  • 使用scaleY =“ value”(值=高度/ 4)(4是进度条的默认高度)

示例包含1 wrap_content ProgressBar,1 8dp ProgressBar和1100dpProgressBar

在此处输入图片说明

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    ...
    android:layout_height="8dp"
    android:scaleY="2" />
Run Code Online (Sandbox Code Playgroud)


小智 7

如果有人仍在寻找解决方案 - 检查此评论

将最小高度设置为4 dp

   android:minHeight="4dp"
Run Code Online (Sandbox Code Playgroud)

——

  <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" />
Run Code Online (Sandbox Code Playgroud)


Ste*_*ley 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"
/>
Run Code Online (Sandbox Code Playgroud)

在build.gradle中:

// Android horizontal ProgressBar doesn't allow removal of top/bottom padding
compile 'me.zhanghai.android.materialprogressbar:library:1.1.6'
Run Code Online (Sandbox Code Playgroud)

该项目有一个很好的演示,显示它与内置ProgressBar之间的差异.


小智 5

<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"/>
Run Code Online (Sandbox Code Playgroud)

我正在使用这个新的进度条

implementation 'com.google.android.material:material:1.3.0'
Run Code Online (Sandbox Code Playgroud)
  • trackThickness:指标和轨迹的粗细。
  • indicatorColor:指标的颜色。
  • trackColor:轨道的颜色。
  • trackCornerRadius:指示器和轨道的圆角半径。
  • indeterminateAnimationType:不确定动画的类型。
  • indicatorDirectionLinear:指标的扫描方向。

查看此水平进度条的结果

  • 2021年最好的方法 (3认同)
  • 现在使用1.3.0-rc01。它被释放了。 (2认同)