天天看點

Android 自定義Progress Bar

android 提供progressdialog,可以提示進度,但你也可以自己實作,示例如下:

Android 自定義Progress Bar

重寫android.app.progressdialog實作自定義進度條彈出框布局

1.簡介系統progressdialog的主要特征

1.在progressdialog的源碼裡可以明顯的看到,在style_horizontal和style_spinner分别顯示的是不同的xml,這就意味着你的進度條要麼是轉圈,要麼是條形的。

2.不管是上述的任何情況下,系統對各部分文字顯示都已經完全格式化。

2.實際情況

但是實際的應用中,我們或者需要改變文字的位置,或者需要轉圈和條形共存,甚至是做出完全颠覆系統進度條的個性進度條,這個時候我們必須去重新設計屬于你自己的進度條。(個人一直認為應用中的元件盡量不用系統的,而是重寫系統的,這樣做出來的應用才是百家争鳴)。

下面就實作我自己的進度條中碰到的幾個可能需要注意的地方給大家交待下:

1.在系統progressdialog的構造函數

public progressdialog(context 

context) 

<p p 

{

this(context, 

com.android.internal.r.style.theme_dialog_alert);

}

複制代碼

中涉及了一個theme:com.android.internal.r.style.theme_dialog_alert,這是我當時遇到的第一個問題,開始的時候翻遍源碼,終于在data/res/values/themes.xml裡找到,

<style name="theme.dialog.alert"><item name="windowbackground">@android:color/transparent</item> 

<item name="windowtitlestyle">@android:style/dialogwindowtitle</item> 

<item name="windowisfloating">true</item> 

<item name="windowcontentoverlay">@null</item> 

</style>

但是發現他還關聯其他style,繼續找下去,結果寫到自己的xml裡還是錯誤一大堆,最後仔細看了下,發現不就是個theme嗎,這就簡單了,有2種方向:1.自己寫theme.2.使用系統的theme。我寫的時候是

public progressdialog1(context context) {

       this(context, android.r.style.theme_panel);

        mcontext = context;

        }

調用系統的android.r.style.theme_panel.

注意:找個地方就是你個性釋放的開始。

2.我要實作的是轉圈和條形并存。那麼肯定得在布局檔案上下手了。

找個地方分2塊說.第1,布局是xml檔案;2,布局是代碼生成。

您可能會問,這有差別嗎?事實上,差別還是蠻大的,不知道你注意到沒有如下屬性

style="?android:attr/progressbarstylehorizontal"

試問,如何代碼實作?

先說第1種,xml的話比較簡單,因為隻需要寫2個progressbar,然後再在代碼裡控制visible屬性就ok,在此不贅述。

第2種,style的實作,這是我碰到的第2個難點

最後我在網上找到1篇文章,關于擷取父類私有屬性的文章,利用反射機制實作了style的設定。

以下工具類是轉載網上那位朋友的工具類,大家可以借鑒下!

public class beanutils {

private beanutils() {

public static void setfieldvalue(final object object,

   final string fieldname, final object value) {

  field field = getdeclaredfield(object, fieldname);

  if (field == null)

   throw new illegalargumentexception("could not find field ["

     + fieldname + "] on target [" + object + "]");

  makeaccessible(field);

  try {

   field.set(object, value);

  } catch (illegalaccessexception e) {

  }

protected static field getdeclaredfield(final object object,

   final string fieldname) {

  return getdeclaredfield(object.getclass(), fieldname);

protected static field getdeclaredfield(final class clazz,

  for (class superclass = clazz; superclass != object.class; superclass = superclass

    .getsuperclass()) {

   try {

    return superclass.getdeclaredfield(fieldname);

   } catch (nosuchfieldexception e) {

   }

  return null;

protected static void makeaccessible(field field) {

  if (!modifier.ispublic(field.getmodifiers())

    || !modifier.ispublic(field.getdeclaringclass().getmodifiers())) {

   field.setaccessible(true);

有了上面的工具類,就可以簡單的設定那些私有屬性

比如:        

beanutils.setfieldvalue(progress_h, "monlyindeterminate", new boolean(false));

        beanutils.setfieldvalue(progress_h, "mminheight", new integer(15));

以上就是我重寫進度條的全部心得,希望能對閱讀完得朋友有些許幫助!

最後附上我的demo,裡面我的調用的布局是代碼實作的,當然也有xml的。

demo說明:功能是前30條形,30-70轉圈,70-100條形  文字跟着變

源碼:http://files.cnblogs.com/shanzei/testprogress.rar

繼續閱讀