2016-11-10 103 views
10

取出填充在我们的应用程序,我们需要一个不确定的进度条,就像这样:水平进度条

progress bar how it should be

我们可以通过对进度设置负余量达到这个目的,像这样:

<ProgressBar 
    android:id="@+id/progressbar" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:indeterminate="true" 
    android:marginTop="-7dp" 
    android:visibility="@{loading ? View.VISIBLE : View.GONE}" /> 

因为ConstraintLayout不支持切缘阴性,它看起来就像这样:

progress bar with padding

好吧,负余量是一个破解。让我们用一个不同的黑客来代替它吧,我们?让我们来介绍一下我们的自定义视图CustomProgressBar,延伸ProgressBar和覆盖其onDraw方法,像这样:

@Override 
protected void onDraw(Canvas canvas) { 
    int marginTop = dpToPx(7); 
    canvas.translate(0, -marginTop); 
    super.onDraw(canvas); 
} 

但所有这一切闻起来像糟糕的代码。必须有更好的解决方案! 你会推荐什么?

回答

4

另一种方法是在父顶部和指南之间使用指南和中心ProgressBar。

<ProgressBar 
    android:id="@+id/progressBar2" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="0dp" 
    android:paddingTop="-4dp" 
    android:layout_height="wrap_content" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintBottom_toTopOf="@+id/guideline" 
    app:layout_constraintTop_toTopOf="parent" /> 

<android.support.constraint.Guideline 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/guideline" 
    android:orientation="horizontal" 
    app:layout_constraintGuide_begin="4dp" /> 
+0

谢谢,实际上做的伎俩!我通过在指南中设置'app:layout_constraintGuide_begin =“9dp”'来改变答案,并且只为工作栏设置'app:layout_constraintTop_toTopOf =“@ + id/guideline”'(不是constraintBottom或padding)。对我来说仍然感到不舒服,但我觉得这是目前最好的选择。 – mreichelt

1

我遇到同样的问题也是如此。就像你说的那样,我遇到了很多解决方案,这些解决方案看起来都像是破解行为,可能会破坏其他方面。 就这样说,我遇到了一个解决方案,就是用这个library代替进度条。

有一点要注意的是,它会告诉你,加入到它集成:

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

然而,当我用这个,它给了我一个错误从Android支持库浮动操作栏。所以,我会建议你使用它代替:

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

一个示例代码段我如何使用它:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar 
    android:id="@+id/reviewProgressBar" 
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="6dp" 
    android:layout_below="@+id/my_toolbar" 
    android:indeterminate="false" 
    app:mpb_progressStyle="horizontal" 
    app:mpb_useIntrinsicPadding="false"/> 

希望这有助于!

0

一个解决方法我所做的是密切设定进度条的高度与中风宽度,像这样:

进度条:

<ProgressBar 
    android:id="@+id/pb_loading_progress" 
    style="@style/Widget.AppCompat.ProgressBar.Horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="2.1dp" 
    android:layout_below="@id/tb_browser" 
    android:max="100" 
    android:progressDrawable="@drawable/style_browser_progress_drawable" 
    android:visibility="invisible" /> 

进展绘制:

<?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="line"> 
      <stroke 
       android:width="2dp" 
       android:color="@color/colorPrimary" /> 
     </shape> 
    </item> 
    <item android:id="@android:id/progress"> 
     <clip 
      android:clipOrientation="horizontal" 
      android:gravity="left"> 
      <shape android:shape="line"> 
       <stroke 
        android:width="2dp" 
        android:color="@color/white" /> 
      </shape> 
     </clip> 
    </item> 
</layer-list> 

看起来像这样:

enter image description here

6

感觉不像黑客攻击的解决方案:在较小的FrameLayout中包含巨大的ProgressBar。这样,FrameLayout限制了它的高度,但ProgressBar仍然显示完整。

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

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

</FrameLayout>