从水平ProgressBar中删除垂直填充

默认情况下,ProgressBar在条形本身上下有一定的填充。 有没有办法删除这个填充,以便只有酒吧到底?

我使用以下解决方法解决此问题。

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

这就是我使用Juozas的答案:

我的ProgressBar高度是4dp。 所以我创build了一个高度为4dp的FrameLayout ,并将ProgressBarlayout_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> 

我结束了使用自定义库来解决这个问题。 大多数其他解决scheme的工作,但结果是不一致的各种设备。

MaterialProgressBar

  • 在Android 4.0+上一致的外观。
  • 正确的平台着色。
  • 能够去除框架ProgressBar的内在填充。
  • 能够隐藏框架水平ProgressBar的轨迹。
  • 用作框架ProgressBar的下拉式replace。

要添加为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页面 。

这个问题的完整解决scheme如下。 以防万一有人需要代码片段,这就是我所做的。

  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" /> 

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

 <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" /> 

可以在父级中绘制垂直居中的ProgressBar,以便剪切填充。 由于ProgressBar不能绘制比父级更大的graphics,因此我们必须创build一个大的父级来放置在裁剪视图内。

 <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> 

Subin的答案似乎是唯一一个(目前)不是在Android的ProgressBar的未来版本中破解脆弱的破解。

但是,我没有经历打破资源,修改和维护这些资源的麻烦,而是select使用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之间的差异。

在使用水平样式的进度条时遇到同样的问题。

根本原因是进度条可以绘制默认的9-patch:(progress_bg_holo_dark.9.png)有一些垂直透明像素作为填充。

最后的解决scheme,为我工作:自定义进度drawable,我的示例代码如下:

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> 

布局片段:

 <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"/> 

我使用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。

将android:progressDrawable添加到绘图中定义的图层列表中,解决了我的问题。 它通过屏蔽自定义drawable中的progess栏来工作

https://stackoverflow.com/a/4454450/1145905中描述了示例实现;

我正在使用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" /> 

尝试以下操作:

 <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" /> 

…然后根据需要configuration进度条,因为它最初将显示带有浅灰色进度背景色的黄色进度色的中等大小的栏。 另外,请注意,没有垂直填充。

与任何版本的Android兼容并且不需要外部库的简单的无技巧解决scheme是在LinearLayout使用两个Views来伪造ProgressBar 。 这是我结束了。 看起来很整洁,这种方法非常灵活 – 你可以用时髦的方式来animation,添加文字等等。

布局:

 <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); } 

结果(添加了一些提升):

在这里输入图像说明