138

デフォルトでは、ProgressBar にはバー自体の上下に特定のパディングがあります。最後にバーだけを持つように、このパディングを削除する方法はありますか?

4

27 に答える 27

73

この問題の回避策として、以下を使用します。

android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"
于 2013-03-25T09:19:22.233 に答える
58

これが私がジュオザスの答えをどのように使用したかです:

私の身長ProgressBarは4dpです。そこでFrameLayout、高さ 4dp の を作成し、 を に設定しlayout_gravityましProgressBarcenter。それは魅力のように機能します。

<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のをlayout_heightProgressBarような大きな数に設定して100dpください。FrameLayout を完全にカバーし、それのみを表示4dpします。

于 2016-03-28T14:25:53.123 に答える
39

この問題を解決するためにカスタムライブラリを使用することになりました。他のソリューションのほとんどは機能しますが、結果はさまざまなデバイス間で一貫していません。

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 ページを参照してください。

于 2016-09-03T15:03:58.707 に答える
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>
于 2016-03-14T12:57:15.793 に答える
14

この問題の完全な解決策は次のとおりです。誰かがコードフラグメントを必要とする場合に備えて、これが私がしたことです。

  1. 8 つの不確定な水平プログレスバーのドローアブルをすべてコピーしました
  2. 画像マニピュレータを使用してドローアブルを編集し、不要なパディングを削除しました
  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" />
</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" />
于 2013-09-16T15:56:30.730 に答える
7

誰かがまだ解決策を探している場合 -- このコメントを確認してください

最小の高さを4 dpに設定する

   android:minHeight="4dp"

-

  <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" />
于 2020-01-23T11:20:51.350 に答える
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"
/>

build.gradle で:

// Android horizontal ProgressBar doesn't allow removal of top/bottom padding
compile 'me.zhanghai.android.materialprogressbar:library:1.1.6'

そのプロジェクトには、組み込みの ProgressBar との違いを示す素晴らしいデモがあります。

于 2016-06-01T16:58:14.137 に答える
2

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 に増加します。

于 2016-05-11T15:06:00.297 に答える
1

Android:progressDrawable をドローアブルで定義されたレイヤーリストに追加すると、問題が修正されました。カスタムドローアブルで進行状況バーをマスクすることで機能します

https://stackoverflow.com/a/4454450/1145905で説明されている実装例

于 2016-06-17T01:11:20.250 に答える
0
 <ProgressBar
        android:layout_marginTop="-8dp"
        android:layout_marginLeft="-8dp"
        android:layout_marginRight="-8dp"
        android:id="@+id/progress_bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:indeterminate="false"
        android:indeterminateTint="@color/white"
        android:max="100"
        android:paddingStart="8dp"
        android:paddingRight="0dp"
        android:progressDrawable="@drawable/progress_bg" />
于 2019-02-05T13:02:15.550 に答える
-1

あらゆるバージョンの Android と互換性があり、外部ライブラリを必要としない単純なトリックなしのソリューションはProgressBar、2 つのViews内部で偽装していLinearLayoutます。これが私が最終的に得たものです。見栄えがよく、このアプローチは非常に柔軟です。ファンキーな方法でアニメーション化したり、テキストを追加したりできます。

レイアウト:

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

}

結果 (高さを追加):

ここに画像の説明を入力

于 2017-09-02T12:53:04.920 に答える
-1

追加のビューや余白をいじることを必要とせずにプログレスバーを上に移動する簡単な方法の 1 つは、属性を使用することです。android:translationZ

そうすれば、XMLで使用できます

<Progressbar
 android:layout_height="wrap_content"
 android:layout_width="match_parent"
 android:translateY="-6dp"
/>

また

スタイル内から使用する

<style name="MyTheme.Progressbar.Horizontal" parent="Widget.AppCompat.Progressbar.Horizontal">
    <item name="android:translateY">-6dp</item>
</style>

そして、このようにレイアウトで参照します

<Progressbar
 android:layout_height="wrap_content"
 android:layout_width="match_parent"
 style="@style/MyTheme.Progressbar.Horizontal"
 />
于 2021-02-16T18:45:35.250 に答える