android自帶ProgressBar圓形進度條修改顏色的技巧方法無bug探索

weixin_34019929發表於2018-03-20

通常來說,解決方法的程式碼是非常短的,但是解決這個事情如果沒想到的話也許一天都搞不定,還不如自己寫一個progressbar或者第三方的,但是我就是有這個強迫症,非得搞定這個問題 為了證明我解決這個問題不容易,我決定長篇大論,通常簡單的程式碼連個回覆的人都沒有,其實有些精華程式碼那是作者花了大量時間才找到的東西,好歹點個讚唄。。

在網上找了一大堆,有設定progressDrawalbe方法的 如下面的程式碼

嘗試1 修改progressdrawable

ClipDrawable clipDrawable = new ClipDrawable(new ColorDrawable(Color.YELLOW), Gravity.LEFT, ClipDrawable.HORIZONTAL);
//                progressBar.setProgressDrawable(colorDrawable);

設定不頂用,我也自己嘗試設定ColorDrawalbe也是設定不頂用,然後嘗試xml
設定progressdrable直接設定顏色,

嘗試2 修改progressdrawableTinit著色

發現也不行然後測試progressdrawabletint 各種修改,竟然都沒有效果 各種修改度沒有效果。包括第二顏色。

嘗試3 再次嘗試程式碼設定drawabletint

    progressBar.setProgressDrawableTiled(colorDrawable);
          /*      int[] colors = new int[] { pressed, focused, normal, focused, unable, normal };
                int[][] states = new int[6][];
                states[0] = new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled };
                states[1] = new int[] { android.R.attr.state_enabled, android.R.attr.state_focused };
                states[2] = new int[] { android.R.attr.state_enabled };
                states[3] = new int[] { android.R.attr.state_focused };
                states[4] = new int[] { android.R.attr.state_window_focused };
                states[5] = new int[] {};
                ColorStateList colorList = new ColorStateList(states, colors);
                return colorList;*/
//                ColorStateList ColorStateList=new ColorStateList();

嘗試4 setIndeterminateDrawable

   ColorDrawable colorDrawable = new ColorDrawable(SuperAppContext.getInstance().getResources().getColor(R.color.colorThemeColor));
   progressBar.setIndeterminateDrawable(drawable);
       

xml程式碼

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:repeatCount="-1"
    android:duration="200"
    android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0"
    android:toDegrees="359">

    <shape android:shape="ring" android:innerRadiusRatio="3"
        android:thicknessRatio="8" android:useLevel="false">

        <size android:width="55dp" android:height="55dp" />

        <gradient android:type="sweep" android:useLevel="false"
            android:startColor="@color/colorThemeColor"
            android:centerY="0.50" android:endColor="@color/transparent" />

    </shape>

</rotate>

這次可以了,但是在fragment裡面出現了一點問題,剛開始是不轉的,但是切換後臺回來就可以轉。
翻看了原始碼感覺只能重新弄一個setProgressdrawable並且呼叫的不是自己已經生成的drawable才能解決問題
這個我就沒嘗試了,我不想用xml設定drawable,我也嘗試過感覺還可以類似玩seekbar那樣來解決問題。問題是我這是動態new的沒法設定主題

嘗試5

   int N = background.getNumberOfFrames();
                    AnimationDrawable newBg = new AnimationDrawable();
                    newBg.setOneShot(background.isOneShot());

                    for (int i = 0; i < N; i++) {
                        final Bitmap tileBitmap = ((BitmapDrawable) background.getFrame(i)).getBitmap();

                        final BitmapShader bitmapShader = new BitmapShader(tileBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
                        shape.getPaint().setShader(bitmapShader);

                        final Drawable result = new ClipDrawable(shape, Gravity.LEFT, ClipDrawable.HORIZONTAL);
                        result.setLevel(10000);
                        newBg.addFrame(result, background.getDuration(i));
                    }
                    newBg.setLevel(10000);*

這些方法都是基於xml AnimationDrawable動畫, 這就蛋疼了。

最後的辦法直接設定IndeterminateDrawable著色無bug

 int color = SuperAppContext.getInstance().getResources().getColor(R.color.colorThemeColor);
                    ColorStateList colorStateList = ColorStateList.valueOf(color);
                    progressBar.setIndeterminateTintList(colorStateList);
                    progressBar.setIndeterminateTintMode(PorterDuff.Mode.SRC_ATOP);

如果要使用xml修改顏色

  <ProgressBar
            android:id="@+id/progressbar"
            android:indeterminateTint="@color/theme_color_red"

            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

2815884-098c83615d71a79f.png
image.png

其他不怎麼好用的方法參考
http://blog.csdn.net/tszxlzc/article/details/38420005
http://blog.csdn.net/chenlove1/article/details/41758977
http://blog.csdn.net/baiyuliang2013/article/details/50767034
https://stackoverflow.com/questions/10951978/change-progressbar-color-through-code-only-in-android
https://stackoverflow.com/questions/30488570/indeterminate-progressbar-with-animation-and-rounded-corners
http://blog.csdn.net/xiangxue336/article/details/9301337

相關文章