回答:
この問題の回避策として次を使用します。
android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"
android:layout_marginTop="-6dp"
私のために働いた。それがデバイスに依存しているかどうか疑問に思いますか?私は唯一のXperia Z1上でテストしている
これは私がJuozasの答えをどのように使用したかです:
私の身長ProgressBar
は4 dpです。私が作成したように、FrameLayout
高さ4DPとし、設定layout_gravity
をProgressBar
します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>
この問題を解決するためにカスタムライブラリを使用することになりました。他のほとんどのソリューションは機能しますが、結果はさまざまなデバイス間で一貫していません。
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ページを参照してください。
誰かがまだ助けが必要な場合はこれを試すことができます:
<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" />
ここでは、進行状況バーはConstraintLayout内にあり、constraintTop_toTopOfおよびconstraintBottom_toTopOf属性は同じ要素に適用する必要があります(この場合はガイドラインです)。
パディングを切り取る親の内部に垂直方向に中央揃えされた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>
の垂直パディングを削除するにはProgressBar
、次のようにします
ProgressBar
例には、1つのwrap_content ProgressBar
、1 8dp ProgressBar
、1 100dp が含まれていますProgressBar
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
...
android:layout_height="8dp"
android:scaleY="2" />
この問題の完全な解決策は次のようになります。誰かがコードの断片を必要とする場合に備えて、これは私がやったことです。
これがprogress_indeterminate_horizontal_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>
最後に、ローカルレイアウトファイルで最小高さを4 dpに設定します。
<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" />
<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi/
Horizontalスタイルでプログレスバーを使用しているときに同じ問題に遭遇しました。
根本的な原因は、プログレスバーのデフォルトの9パッチのドローアブル(progress_bg_holo_dark.9.png)にパディングとして垂直方向の透明なピクセルがあることです。
私のために働いた最後のソリューション:進行状況のドローアブルをカスタマイズし、私のサンプルコードを次のようにカスタマイズします。
custom_horizontal_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"/>
1つのトリックは、プログレスバーに負のマージンを追加することです。
画面の上部にあると想定した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" />
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の違いを示す素晴らしいデモがあります。
誰かがまだ解決策を探している場合-このコメントを確認してください
最小の高さを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" />
私は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に増加します。
以下を試してください:
<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" />
...プログレスバーは、黄色のプログレスバックグラウンドティントと黄色のプログレスバックグラウンドティントを持つ中型のバーを最初に表示するため、必要に応じて構成します。また、垂直パディングがないことに注意してください。
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>
android:progressDrawableをドローアブルで定義されたレイヤーリストに追加すると、問題が解決しました。カスタムドローアブルの進捗バーをマスクすることで機能します
私が使用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" />
新しいモジュールをダウンロードしたり、プログレスバーの周りにFrameLayoutを配置したりする必要はありません。これらはすべてハックです。2つのステップのみ:
あなたのwhatever.xmlで
<ProgressBar
android:id="@+id/workoutSessionGlobalProgress"
android:layout_width="match_parent"
android:layout_height="YOUR_HEIGHT"
android:progressDrawable="@drawable/progress_horizontal"
android:progress="0"
<!-- High value to make ValueAnimator smoother -->
android:max="DURATION * 1000"
android:indeterminate="false"
style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"/>
progress_horizontal.xml、必要に応じて値を変更します。
丸みを帯びた角が好きではありませんか?
コーナー半径を削除
色が気に入らない?色などを変更しました!
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ff9d9e9d"
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:angle="270"
/>
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#80ffd300"
android:centerColor="#80ffb600"
android:centerY="0.75"
android:endColor="#a0ffcb00"
android:angle="270"
/>
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ffffd300"
android:centerColor="#ffffb600"
android:centerY="0.75"
android:endColor="#ffffcb00"
android:angle="270"
/>
</shape>
</clip>
</item>
</layer-list>
一般的に、これらはあなたが好きではないもののコードを変更するためのステップです。ソースコードを見つけて、何を変更すべきかを見つけ出すだけです。ProgressBarソースコードをたどると、それが参照するprogress_horizontal.xmlというファイルが見つかります。基本的に、XMLの問題をすべて解決する方法。
<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" />
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progressBar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:indeterminate="true"
android:paddingTop="2dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
マージンが隠されていないMaterial ProgressIndicatorを使用してください。
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/progressBar"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:indicatorColor="@color/colorPrimary"
app:trackColor="@color/colorAccent" />
Androidのすべてのバージョンと互換性があり、外部ライブラリを必要としないシンプルなトリックソリューションはProgressBar
、Views
内部に2つあり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);
}
結果(いくつかの高度が追加されています):
最良の解決策は
android:minHeight="0dp"
回避策はなく、魅力のように機能します。
minHeight
事前定義された0(たとえば32dp)より大きいaがあるため、これは機能するはずです。このプロパティを変更すると、別の外観になります。
maxHeight
は機能しません。