私は自分のAndroidアプリケーションで水平方向のプログレスバーを使用していて、プログレスカラー(デフォルトは黄色)を変更したいと思います。 XMLではなくcode
を使用してそれを行うことができますか。
それが答えではないことを残念に思いますが、要件をコードから設定している理由は何ですか? .setProgressDrawable
は正しく定義されていれば動作するはずです
<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="@color/progress_start"
Android:endColor="@color/progress_end"
Android:angle="270"
/>
</shape>
</clip>
</item>
</layer-list>
水平型のProgressBarでは、ColorFilter
を使うこともできます。
progressBar.getProgressDrawable().setColorFilter(
Color.RED, Android.graphics.PorterDuff.Mode.SRC_IN);
注: これにより、アプリ内のすべてのプログレスバーの外観が変更されます。特定のプログレスバーを1つだけ変更するには、次の操作を行います。
Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, Android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);
ProgressBarが不定の場合は、getIndeterminateDrawable()
ではなくgetProgressDrawable()
を使用してください。
Lollipop(API 21)から、あなたはプログレスティントを設定することができます。
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
これはプログラム的ではありませんが、とにかく多くの人々を助けることができると思います!私はたくさん試しましたが、最も効率的な方法は、.xmlファイルのProgressBarにこの行を追加することでした。
Android:indeterminate="true"
Android:indeterminateTintMode="src_atop"
Android:indeterminateTint="@color/secondary"
だから最後にこのコードは私のためにそれをやった:
<ProgressBar
Android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true"
Android:layout_marginTop="50dp"
Android:layout_marginBottom="50dp"
Android:visibility="visible"
Android:indeterminate="true"
Android:indeterminateTintMode="src_atop"
Android:indeterminateTint="@color/secondary">
このソリューションは API 21+ で機能します
私の不確定プログレスバー(スピナー)のために私はただドロウアブルにカラーフィルターを設定します。 1行だけでうまく動作します。
色を赤に設定する例:
ProgressBar spinner = new Android.widget.ProgressBar(
context,
null,
Android.R.attr.progressBarStyle);
spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, Android.graphics.PorterDuff.Mode.MULTIPLY);
これは古い質問ですが、テーマの使用はここでは言及されていません。デフォルトテーマがAppCompat
を使用している場合、あなたのProgressBar
の色はあなたが定義したcolorAccent
になります。
colorAccent
を変更すると、ProgressBar
の色も変更されますが、複数の場所で変更が反映されることもあります。ですから、特定のPregressBar
に対してだけ違う色が欲しい場合は、そのProgressBar
にテーマを適用することでそれを実現できます。
デフォルトのテーマを拡張してcolorAccent
をオーバーライドする
<style name="AppTheme.WhiteAccent">
<item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
</style>
そしてProgressBar
にAndroid:theme
属性を追加します。
Android:theme="@style/AppTheme.WhiteAccent"
だからそれはこのようになります:
<ProgressBar
Android:id="@+id/loading"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:padding="10dp"
Android:theme="@style/AppTheme.WhiteAccent" />
ですから、あなたは自分の特定のcolorAccent
に対してProgressBar
を変更しているだけです。
注 :style
を使用しても機能しません。 Android:theme
のみを使用する必要があります。あなたはここでテーマのより多くの使用を見つけることができます: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH
いくつかの提案に従って、あなたは色で形とclipdrawableを指定してそれを設定することができます。私はこれをプログラム的に動かしています。これが私のやり方です。
最初にドロウアブルライブラリをインポートしてください。
import Android.graphics.drawable.*;
それから以下のようなコードを使います。
ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);
pg.setBackgroundDrawable(getResources().getDrawable(Android.R.drawable.progress_horizontal));
pg.setProgress(45);
すべてのAPI
すべてのAPIを使用する場合は、単にテーマをスタイルで作成してください。
style.xml
<resources>
//...
<style name="progressBarBlue" parent="@style/Theme.AppCompat">
<item name="colorAccent">@color/blue</item>
</style>
</resources>
そして使用中
<ProgressBar
...
Android:theme="@style/progressBarBlue" />
APIレベル21以上
aPIレベル21以降で使用する場合は、次のコードを使用してください。
<ProgressBar
//...
Android:indeterminate="true"
Android:indeterminateTintMode="src_atop"
Android:indeterminateTint="@color/secondary"/>
これは私のために働いた:
<ProgressBar
Android:indeterminateTint="#d60909"
... />
不確定の場合:
((ProgressBar)findViewById(R.id.progressBar))
.getIndeterminateDrawable()
.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
2016年の現在、私はいくつかのLollipop以前のデバイスがcolorAccent
設定を尊重していないことに気づいたので、すべてのAPIに対する私の最終的な解決策は現在以下のようになっています。
// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), Android.R.color.holo_green_light));
mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), Android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}
ボーナスポイントのために、それは少しの非難されたコードも使いません。それを試してみてください!
デフォルトのプログレスバーの外観を変更しようとしているときに同じ問題にぶつかる。これは、おそらく人々に役立つと思われるいくつかの詳細な情報です:)
a-z0-9_.
(すなわち、大文字ではありません!)R.drawable.filename
ですmyProgressBar.setProgressDrawable(...)
を使用しますが、カスタムレイアウトを単にR.drawable.filename
として参照する必要はなく、Drawable
として取得する必要があります。Resources res = getResources();
myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
ProgressBar:
<ProgressBar
Android:id="@+id/progressBar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_weight="4"
Android:indeterminateDrawable="@drawable/progressdrawable"
/>
progressdrawable.xml:
好きなように色を変えるのにグラデーションを使います。そしてAndroid:toDegrees = "X"はXの値を増加させ、プログレスバーは速く回転します。減少してゆっくり回転します。ニーズに合わせてカスタマイズしてください。
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="4000"
Android:fromDegrees="0"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toDegrees="360" >
<shape
Android:innerRadius="20dp"
Android:shape="ring"
Android:thickness="4dp"
Android:useLevel="false" >
<size
Android:height="48dp"
Android:width="48dp" />
<gradient
Android:centerColor="#80ec7e2a"
Android:centerY="0.5"
Android:endColor="#ffec7e2a"
Android:startColor="#00ec7e2a"
Android:type="sweep"
Android:useLevel="false" />
</shape>
</rotate>
この答えで言及されていないことがおそらく1つあります。
あなたのテーマがTheme.AppCompat
から継承している場合、ProgressBar
はあなたがあなたのテーマで"colorAccent"
として定義した色を仮定します。
だから、使用して..
<item name="colorAccent">@color/custom_color</item>
.. ProgressBarの色を自動的に@color/custom_color
に着色します。
Android:progressTint="#ffffff"
私は水平ProgressBarでそれをやった方法:
LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
Drawable progressDrawable = layerDrawable.findDrawableByLayerId(Android.R.id.progress);
progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
スタイル、テーマを変更したり、Androidを使用したりすることができます。indeterminateTint = "@ color/yourColor"任意の場所で使用できますが、Android SKDのすべてのバージョンで機能する方法は1つだけです。
プログレスバーが不確定ではない場合は、次のように入力してください。
progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );
プログレスバーが不確定な場合は、次のものを使用してください。
progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );
Androidがこんなに混乱しているのは残念です。
この解決策は私のために働きました:
<style name="Progressbar.White" parent="AppTheme">
<item name="colorControlActivated">@color/white</item>
</style>
<ProgressBar
Android:layout_width="@dimen/d_40"
Android:layout_height="@dimen/d_40"
Android:indeterminate="true"
Android:theme="@style/Progressbar.White"/>
レイアウトxmlファイルの色を変更する場合は、以下のコードを使用し、希望の色に indeterminateTint プロパティを使用します。
<ProgressBar
Android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
Android:layout_width="wrap_content"
Android:indeterminate="true"
Android:indeterminateTintMode="src_atop"
Android:indeterminateTint="#ddbd4e"
Android:layout_height="wrap_content"
Android:layout_marginBottom="20dp"
Android:layout_alignParentBottom="true"
Android:layout_centerHorizontal="true" />
もう1つ重要なことは、ベーステーマを継承した場合、テーマソリューションは機能するため、アプリをコンパクトにするためのテーマは次のとおりです。
<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
<item name="colorAccent">@color/custom</item>
</style>
そしてプログレスバーのテーマでこれを設定します
<ProgressBar
Android:id="@+id/progressCircle_progressBar"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:theme="@style/AppTheme.Custom"
Android:indeterminate="true"/>
/についての情報を追加するために投稿されました PaulieGの答え 、ateiobが私に何かを説明するように依頼したので...
ProgressBar
コードには、進行状況を値に設定しようとする試みを無視するバグ/問題/最適化がある(あるいは、少なくとも現時点のAndroidソースコードを見たときの執筆時点で)あったと言えます。それはすでににあります。
ProgressBar.setProgressDrawable()
を呼び出した後、プログレスバーは空白になります(描画可能部分を変更したため)。
これは進行状況を設定し、それを再描画する必要があることを意味します。ただし、進行状況をそのままの値に設定しただけでは何も起こりません。
あなたは最初にそれを0に設定しなければなりませんそしてそれから再び "古い"値にしなければなりません、そしてバーは再描画します。
要約すると:
下記は私が持っている方法です。
protected void onResume()
{
super.onResume();
progBar = (ProgressBar) findViewById(R.id.progress_base);
int oldProgress = progBar.getProgress();
// define new drawable/colour
final float[] roundedCorners = new float[]
{ 5, 5, 5, 5, 5, 5, 5, 5 };
ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
roundedCorners, null, null));
String MyColor = "#FF00FF";
shape.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
ClipDrawable.HORIZONTAL);
progBar.setProgressDrawable(clip);
progBar.setBackgroundDrawable(getResources().getDrawable(
Android.R.drawable.progress_horizontal));
// work around: setProgress() ignores a change to the same value
progBar.setProgress(0);
progBar.setProgress(oldProgress);
progBar.invalidate();
}
HappyEngineerの解決策に関しては、 "progress"オフセットを手動で設定することも同様の回避策だったと思います。どちらの場合でも、上記のコードはあなたのために働くはずです。
これはProgressBarの色をプログラムで変更するためのコードです。
ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));
水平スタイルのProgressBarには、次のものを使用します。
import Android.widget.ProgressBar;
import Android.graphics.drawable.GradientDrawable;
import Android.graphics.drawable.ClipDrawable;
import Android.view.Gravity;
import Android.graphics.drawable.Drawable;
import Android.graphics.drawable.LayerDrawable;
public void setColours(ProgressBar progressBar,
int bgCol1, int bgCol2,
int fg1Col1, int fg1Col2, int value1,
int fg2Col1, int fg2Col2, int value2)
{
//If solid colours are required for an element, then set
//that elements Col1 param s the same as its Col2 param
//(eg fg1Col1 == fg1Col2).
//fgGradDirection and/or bgGradDirection could be parameters
//if you require other gradient directions eg LEFT_RIGHT.
GradientDrawable.Orientation fgGradDirection
= GradientDrawable.Orientation.TOP_BOTTOM;
GradientDrawable.Orientation bgGradDirection
= GradientDrawable.Orientation.TOP_BOTTOM;
//Background
GradientDrawable bgGradDrawable = new GradientDrawable(
bgGradDirection, new int[]{bgCol1, bgCol2});
bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
bgGradDrawable.setCornerRadius(5);
ClipDrawable bgclip = new ClipDrawable(
bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
bgclip.setLevel(10000);
//SecondaryProgress
GradientDrawable fg2GradDrawable = new GradientDrawable(
fgGradDirection, new int[]{fg2Col1, fg2Col2});
fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
fg2GradDrawable.setCornerRadius(5);
ClipDrawable fg2clip = new ClipDrawable(
fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
//Progress
GradientDrawable fg1GradDrawable = new GradientDrawable(
fgGradDirection, new int[]{fg1Col1, fg1Col2});
fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
fg1GradDrawable.setCornerRadius(5);
ClipDrawable fg1clip = new ClipDrawable(
fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
//Setup LayerDrawable and assign to progressBar
Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);
progressLayerDrawable.setId(0, Android.R.id.background);
progressLayerDrawable.setId(1, Android.R.id.secondaryProgress);
progressLayerDrawable.setId(2, Android.R.id.progress);
//Copy the existing ProgressDrawable bounds to the new one.
Rect bounds = progressBar.getProgressDrawable().getBounds();
progressBar.setProgressDrawable(progressLayerDrawable);
progressBar.getProgressDrawable().setBounds(bounds);
// setProgress() ignores a change to the same value, so:
if (value1 == 0)
progressBar.setProgress(1);
else
progressBar.setProgress(0);
progressBar.setProgress(value1);
// setSecondaryProgress() ignores a change to the same value, so:
if (value2 == 0)
progressBar.setSecondaryProgress(1);
else
progressBar.setSecondaryProgress(0);
progressBar.setSecondaryProgress(value2);
//now force a redraw
progressBar.invalidate();
}
呼び出し例は次のようになります。
setColours(myProgressBar,
0xff303030, //bgCol1 grey
0xff909090, //bgCol2 lighter grey
0xff0000FF, //fg1Col1 blue
0xffFFFFFF, //fg1Col2 white
50, //value1
0xffFF0000, //fg2Col1 red
0xffFFFFFF, //fg2Col2 white
75); //value2
「二次的な進捗」が必要ない場合は、単にvalue2をvalue1に設定してください。
Android.support.v4.graphics.drawable.DrawableCompat :を使用してください。
Drawable progressDrawable = progressBar.getIndeterminateDrawable();
if (progressDrawable != null) {
Drawable mutateDrawable = progressDrawable.mutate();
DrawableCompat.setTint(mutateDrawable, primaryColor);
progressBar.setProgressDrawable(mutateDrawable);
}
あなたがマルチスタイルアプリを扱っているなら、attrを使うのはとても簡単です:
この方法を試してください:
以下の属性attrs.xmlを宣言してください
<attr name="circularProgressTheme" format="reference"></attr>
Styles.xmlのコードの下に貼り付けます
<style name="ProgressThemeWhite" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">#FF0000</item>
</style>
<style name="circularProgressThemeWhite">
<item name="Android:theme">@style/ProgressThemeWhite</item>
</style>
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="circularProgressTheme">@style/circularProgressThemeWhite</item>
</style>
下のようにプログレスバーを使う
<ProgressBar
style="?attr/circularProgressTheme"
Android:id="@+id/commonProgress"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:visibility="visible"/>
SDK ver 21以降で推奨されているmuhammad-adilに従って
Android:indeterminateTint="@color/orange"
xML Worksでは私にとっては十分に簡単です。
ProgressBar bar;
private Handler progressBarHandler = new Handler();
GradientDrawable progressGradientDrawable = new GradientDrawable(
GradientDrawable.Orientation.LEFT_RIGHT, new int[]{
0xff1e90ff,0xff006ab6,0xff367ba8});
ClipDrawable progressClipDrawable = new ClipDrawable(
progressGradientDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
Drawable[] progressDrawables = {
new ColorDrawable(0xffffffff),
progressClipDrawable, progressClipDrawable};
LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);
int status = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO Auto-generated method stub
setContentView(R.layout.startup);
bar = (ProgressBar) findViewById(R.id.start_page_progressBar);
bar.setProgress(0);
bar.setMax(100);
progressLayerDrawable.setId(0, Android.R.id.background);
progressLayerDrawable.setId(1, Android.R.id.secondaryProgress);
progressLayerDrawable.setId(2, Android.R.id.progress);
bar.setProgressDrawable(progressLayerDrawable);
}
これは私がコードを通してプログレスバーにカスタムカラーを設定するのを助けました。それが役に立てば幸い
このカスタムスタイルをプログレスバーに適用します。
<style name="customProgress" parent="@Android:style/Widget.ProgressBar.Small">
<item name="Android:indeterminateDrawable">@drawable/progress</item>
<item name="Android:duration">40</item>
<item name="Android:animationCache">true</item>
<item name="Android:drawingCacheQuality">low</item>
<item name="Android:persistentDrawingCache">animation</item>
</style>
@ drawable/progress.xml -
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:drawable="@drawable/spinner_white"
Android:pivotX="50%"
Android:pivotY="50%" />
より良い結果を得るために、あなたは複数のプログレスイメージを使うことができます。 Androidプラットフォーム自体はプログレスバーに画像を使用するため、画像の使用を躊躇しないでください。コードはsdkから抽出されています:)
水平プログレスバーのカスタムマテリアルスタイル:
背景色と水平プログレスバーの進行状況を変更します。
<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
<item name="Android:progressBackgroundTint">#69f0ae</item>
<item name="Android:progressTint">#b71c1c</item>
<item name="Android:minWidth">200dp</item>
</style>
カスタムのマテリアルスタイルとカスタムのプログレスバーのチェック用に、style属性を設定してプログレスバーに適用します http://www.zoftino.com/Android-progressbar-and-custom-progressbar-examples
Horizontal ProgressBar
は背景にrectangle shape
drawableを使用し、プログレッシブ用にrectangle shape
から構築されたClipDrawable
を使用します(プライマリとセカンダリ)。着色すると色が多少変わります。 ターゲットカラーが必要な場合 3つすべてに別々に使用する場合は、次のようにProgressBar.setProgressDrawable()
を使用できます。
LayerDrawable progressBarDrawable = new LayerDrawable(
new Drawable[]{
new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{Color.parseColor("#ff0000ff"),Color.parseColor("#ff0000ff")}),
new ClipDrawable(
new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{Color.parseColor("#ff00ff00"),Color.parseColor("#ff00ff00")}),
Gravity.START,
ClipDrawable.HORIZONTAL),
new ClipDrawable(
new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{Color.parseColor("#ffff0000"),Color.parseColor("#ffff0000")}),
Gravity.START,
ClipDrawable.HORIZONTAL)
});
progressBarDrawable.setId(0,Android.R.id.background);
progressBarDrawable.setId(1,Android.R.id.secondaryProgress);
progressBarDrawable.setId(2,Android.R.id.progress);
((ProgressBar)findViewById(R.id.progressBar)).setProgressDrawable(progressBarDrawable);
LayerDrawable
を初期化している間、描画可能レイヤの順序は重要です。最初のdrawableは背景用です。私の実験によると、切り替えIDは機能しません。パディングをprogressbar
に設定した場合、このアプローチは機能しません。あなたがパディングを必要とするなら、あなたはLinearLayout
のようなプログレスバーのためのコンテナを使うことができます。
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);
freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, Android.graphics.PorterDuff.Mode.SRC_IN);
プログレスバーの水平方向の色を変更するには(kotlinで):
fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
progress.progressTintList = ColorStateList.valueOf(color)
} else{
val layerDrawable = progress.progressDrawable as? LayerDrawable
val progressDrawable = layerDrawable?.findDrawableByLayerId(Android.R.id.progress)
progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
}
}
不確定のProgressBarカラーを変更するには
fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
progress.indeterminateTintList = ColorStateList.valueOf(color)
} else {
(progress.indeterminateDrawable as? LayerDrawable)?.apply {
if (numberOfLayers >= 2) {
setId(0, Android.R.id.progress)
setId(1, Android.R.id.secondaryProgress)
val progressDrawable = findDrawableByLayerId(Android.R.id.progress).mutate()
progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
}
}
}
}
そしてそれはついに普通にロリポップ前のプログレスバーを色づける
単に使用します:
PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Gingerbread_MR1) {
mode = PorterDuff.Mode.MULTIPLY;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
Drawable progressDrawable;
progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
progressBar.setProgressDrawable(progressDrawable);
}