在我们的应用程序中,我们需要一个不确定的进度条,如下所示:
我们可以通过在ProgressBar上设置负边距来实现这一点,如下所示:
//...
$scope.showMap = function(mapID) {
document.addEventListener("deviceready", function() {
var div = document.getElementById("map" + mapID);
//...
但是因为ConstraintLayout不支持负边距,所以它看起来像这样:
好的,负利润是一个黑客。让我们换一个不同的黑客,好吗?让我们来介绍我们的自定义视图<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}" />
,它扩展CustomProgressBar
并覆盖其ProgressBar
方法,如下所示:
onDraw
但所有这些都闻起来像坏代码。必须有一个更好的解决方案! 你会推荐什么?
答案 0 :(得分:12)
感觉不像黑客的解决方案:将较小的ProgressBar
包裹在较小的FrameLayout
中。这样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>
答案 1 :(得分:6)
另一种方法是在父顶部和指南之间使用指南和中心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" />
答案 2 :(得分:2)
我也遇到了同样的问题。就像你说的那样,我遇到了许多解决方案,这些解决方案看起来都像是一个破坏其他东西的黑客。 话虽如此,我遇到了一个解决方案,即使用此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"/>
希望这有帮助!
答案 3 :(得分:1)
我做的脏解决方法是将ProgressBar的高度设置为与笔划宽度紧密相似,如下所示:
进度条:
<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" />
Progress drawable:
<?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>
看起来像这样:
答案 4 :(得分:1)
在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>
答案 5 :(得分:0)
您声明的视图没有任何明确的高度,因此它的高度是从预定义样式中选取的。
<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}" />
将在当前主题中搜索“?android:attr / progressBarStyleHorizontal”,并将其存储在attrs.xml文件中。由于这是由平台定义的,因此它将从那里获取其价值。在撰写此答案时,我在android平台29上,搜索“?android:attr / progressBarStyleHorizontal”会得到以下结果
➜ values
pwd
/Users/vihaanverma/Library/Android/sdk/platforms/android-29/data/res/values
➜ values
grep -rin "progressBarStyleHorizontal" .
./themes_device_defaults.xml:126: <item name="progressBarStyleHorizontal">@style/Widget.DeviceDefault.ProgressBar.Horizontal</item>
./themes_device_defaults.xml:857: <item name="progressBarStyleHorizontal">@style/Widget.DeviceDefault.Light.ProgressBar.Horizontal</item>
./themes.xml:272: <item name="progressBarStyleHorizontal">@style/Widget.ProgressBar.Horizontal</item>
./themes_holo.xml:263: <item name="progressBarStyleHorizontal">@style/Widget.Holo.ProgressBar.Horizontal</item>
./themes_holo.xml:626: <item name="progressBarStyleHorizontal">@style/Widget.Holo.Light.ProgressBar.Horizontal</item>
./public.xml:148: <public type="attr" name="progressBarStyleHorizontal" id="0x01010078" />
./themes_material.xml:258: <item name="progressBarStyleHorizontal">@style/Widget.Material.ProgressBar.Horizontal</item>
./themes_material.xml:635: <item name="progressBarStyleHorizontal">@style/Widget.Material.Light.ProgressBar.Horizontal</item>
./styles_material.xml:1010: <item name="progressBarStyle">?attr/progressBarStyleHorizontal</item>
./attrs.xml:684: <attr name="progressBarStyleHorizontal" format="reference" />
➜ values
打开包含“ progressBarStyleHorizontal”的文件之一,您将看到该样式中定义的minHeight并等于16dp。
<style name="Widget.Material.ProgressBar.Horizontal" parent="Widget.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>
</style>
这是您获得额外填充的原因。您可以通过提供视图高度和下面的scaleY值来解决此问题
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="5dp"
android:indeterminate="true"
android:scaleY="5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />