web-dev-qa-db-ja.com

Android-Lollipop以前のデバイスでのProgressBarの色付け

私のアプリの最小APIレベルは19(KitKat)で、水平ProgressBarのレイアウトが含まれています。 Android:progressTint属性を使用して、バーをカスタムカラーに色付けしています。 Lollipop(API 21)以降ではかなりうまく機能しますが、それ以下(たとえばAPI 19)では機能しません。別の色で表示されます。その理由は、この属性

aPIレベル21以上でのみ使用されます

Android Studioの状態。

ですから、Lollipop以前のデバイスでもProgressBarを着色するための良い代替手段になるのではないかと思っています。 XMLでレイアウトファイル内に作成できますか?または、これは別の方法で行う必要がありますか?


編集#1:私のProgressBarは、具体的な値をパーセントで表示するために使用され、レイアウトがロードされていることを示すためではありません。 Kuldeep Kulkarniが以下に書いたものを試した後、私のバーはマテリアルロードインジケーターのように見えたので、これを明確にしたいと思います(もちろん、Lollipopデバイスでは、KitKatデバイスで目に見える結果はありません)。

12
Geryson

皆からの提案をありがとう! :)

私にとって有効な解決策は、<layer-list>ルート要素を使用してカスタムのドローアブルXMLファイルを作成することです。そこで、ネイティブAndroid IDs @Android:id/background and @Android:id/progress]を使用して2つのレイヤーアイテムを定義しています。この後、目的の形状と色のリソースを定義できますこのソリューションは this SO質問に対する一般的な回答です。


res/drawable/progressbar.xmlファイルの内容:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:id="@Android:id/background">

        <shape>

            <corners Android:radius="2dip" /> <!--optional-->

            <gradient
                Android:angle="270"
                Android:endColor="@color/gray"
                Android:startColor="@color/gray" />

        </shape>

    </item>

    <item Android:id="@Android:id/progress">

        <clip>

            <shape>

                <corners Android:radius="2dip" /> <!--optional-->

                <gradient
                    Android:angle="270"
                    Android:endColor="@color/blue"
                    Android:startColor="@color/blue" />

            </shape>

        </clip>

    </item>

</layer-list>

レイアウトXMLファイルでprogressDrawableProgressBarとして定義:

<ProgressBar
        Android:id="@+id/progress_bar"
        Android:layout_width="0dp"
        Android:layout_height="@dimen/progress_bar_height"
        Android:progressDrawable="@drawable/progressbar" />

API 19の下でテストする機会はありませんでしたが、このレベル以上では完全に動作します。

5
Geryson

ProgressBar indeterminateDrawablepre-Lollipopメソッドでラップできます。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {

     Drawable drawableProgress = DrawableCompat.wrap(progressBar.getIndeterminateDrawable());
     DrawableCompat.setTint(drawableProgress, ContextCompat.getColor(getContext(), Android.R.color.holo_green_light));
     progressBar.setIndeterminateDrawable(DrawableCompat.unwrap(drawableProgress));

} else {
    progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), Android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}
24
Satan Pandeya
progress.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
10
Elias Nawfal

これは私のために働く

<ProgressBar
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"
   Android:theme="@style/progressBarBlue" />

次に、style.xml定義progressBarBlue

<style name="progressBarWhite" parent="@style/Theme.AppCompat">
   <item name="colorAccent">@color/blue</item>
</style>
1
Dennis Mwagiru

プログラムで実行したい場合は、これを試してください

public static void setSeekbarTint(SeekBar seekbar, int color) {
        PorterDuff.Mode porterDuffMode = PorterDuff.Mode.SRC_IN;
        if (seekbar.getIndeterminateDrawable() != null)
            seekbar.getIndeterminateDrawable().setColorFilter(color, porterDuffMode);

        if (seekbar.getProgressDrawable() != null &&
                seekbar.getProgressDrawable() instanceof LayerDrawable) {
            LayerDrawable layerDrawable = (LayerDrawable) seekbar.getProgressDrawable();
            GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.findDrawableByLayerId(Android.R.id.background);

            layerDrawable.setColorFilter(color, porterDuffMode);
            seekbar.setProgressDrawable(layerDrawable);
            gradientDrawable.setColorFilter(Color.WHITE, porterDuffMode);
        } else if (seekbar.getProgressDrawable() != null &&
                seekbar.getProgressDrawable() instanceof ClipDrawable) {
            ClipDrawable clipDrawable = (ClipDrawable) seekbar.getProgressDrawable();
            clipDrawable.setColorFilter(color, porterDuffMode);
            seekbar.setProgressDrawable(clipDrawable);
        }
}
0