2010-05-12 78 views
114

閱讀Google提供的有限文檔,我感覺可以通過簡單地創建一個新樣式並將其分配給樣式來更改ProgressBar/ProgressDialog的外觀(可繪製) ProgressBar的屬性。但我無法讓這個工作正常。下面是我做的,到目前爲止:自定義可繪製ProgressBar/ProgressDialog

我創建了一個形狀像這樣(mp2.xml)

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="ring" 
    android:innerRadiusRatio="4" 
    android:thicknessRatio="4" 
    android:useLevel="false"> 
<size android:width="50dip" android:height="50dip" /> 
<gradient android:type="sweep" android:useLevel="false" android:startColor="#300000ff" android:centerColor="#500000ff" android:endColor="#ff0000ff" /> 
</shape> 

然後創建一個動畫(mp3.xml)是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="30" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="30" android:toDegrees="60" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="60" android:toDegrees="90" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="90" android:toDegrees="120" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="120" android:toDegrees="150" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="150" android:toDegrees="180" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="180" android:toDegrees="210" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="210" android:toDegrees="240" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="240" android:toDegrees="270" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="270" android:toDegrees="300" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="300" android:toDegrees="330" android:repeatCount="1" /> 
</item> 
<item android:duration="70"> 
    <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="330" android:toDegrees="360" android:repeatCount="1" /> 
</item> 
</animation-list> 

然後創建一個樣式(attrs.xml)是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<style parent="@android:style/Widget.ProgressBar" name="customProgressBar"> 
    <item name="android:progressDrawable">@anim/mp3</item> 
</style> 
</resources> 

和在我main.xml中我已經設置這樣的風格:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:drawingCacheQuality="high"> 
<ProgressBar android:id="@+id/ProgressBar01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" style="@style/customProgressBar"/> 
</LinearLayout> 

但它仍然顯示了同樣的繪製前。我究竟做錯了什麼?

+0

正好是瀏覽樣品,看完之後你對面來了[這裏](http://groups.google.com/group/android-developers/browse_thread/thread/51188f7e52a83ded/de8c88581592d059?lnk=raot) 。希望它能解決你的問題。 – reuscam 2010-07-09 20:33:47

+0

我知道如何創建形狀/漸變/動畫。我在上面創建的那個是基於你引用的帖子(我不得不改變它,因爲它看起來非常波濤洶涌,速度很慢)。我只是希望能夠使用「風格」來實現這一點。 感謝您的反饋 – Sam 2010-07-12 10:56:45

+0

如果您想完全自定義您的進度條,並真正看中[本博客文章](http://www.jagsaund.com/blog/2011/11/6/customizing- your-progress-bar-part-one.html)它可能超出了你想要的或者可能只是你想要的。希望能幫助到你! – jagsaund 2011-11-12 09:49:02

回答

5

我做你的代碼。我可以跑,但我需要修改兩個地方:

  1. name="android:indeterminateDrawable"而不是android:progressDrawable

  2. 修改名稱attrs.xml ---> styles.xml

+0

我試過了。它不起作用。 drawable不會改變。 – Sam 2010-10-19 17:00:43

+0

你修改你的android:startColor =「#300000ff」爲#FF00ff00,修改其他顏色 – pengwang 2010-10-20 09:13:39

131

我用下面的方法創建一個自定義進度條。

文件res/drawable/progress_bar_states.xml聲明不同狀態的顏色:

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

    <item android:id="@android:id/background"> 
     <shape> 
      <gradient 
        android:startColor="#000001" 
        android:centerColor="#0b131e" 
        android:centerY="0.75" 
        android:endColor="#0d1522" 
        android:angle="270" 
      /> 
     </shape> 
    </item> 

    <item android:id="@android:id/secondaryProgress"> 
     <clip> 
      <shape> 
       <gradient 
         android:startColor="#234" 
         android:centerColor="#234" 
         android:centerY="0.75" 
         android:endColor="#a24" 
         android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 

    <item android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <gradient 
        android:startColor="#144281" 
        android:centerColor="#0b1f3c" 
        android:centerY="0.75" 
        android:endColor="#06101d" 
        android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 

</layer-list> 

和代碼佈局XML中:

<ProgressBar android:id="@+id/progressBar" 
    android:progressDrawable="@drawable/progress_bar_states" 
    android:layout_width="fill_parent" android:layout_height="8dip" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:indeterminateOnly="false" 
    android:max="100"> 
</ProgressBar> 

享受!

+0

真棒,它甚至用drawables這種方式 – alkar 2011-01-21 14:05:43

+0

這樣的作品,但我不能讓它與drawables工作 – 2012-02-22 18:22:41

+0

@YuliaRogovaya是它因爲drawable不在剪輯元素中?我無法使其工作;懷疑剪輯元素是關鍵。 – 2013-05-09 19:29:24

0

我不確定,但在這種情況下,您仍然可以使用完全自定義的AlertDialog,方法是在警報對話框中設置單獨的佈局文件,並使用上面代碼的一部分爲您的imageview設置動畫它!

10

你的風格應該是這樣的:

<style parent="@android:style/Widget.ProgressBar" name="customProgressBar"> 
    <item name="android:indeterminateDrawable">@anim/mp3</item> 
</style> 
27

嘗試設置:

android:indeterminateDrawable="@drawable/progress" 

它爲我工作。這裏也是progress.xml代碼:

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

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

     <size android:width="48dip" android:height="48dip" /> 

     <gradient android:type="sweep" android:useLevel="false" 
      android:startColor="#4c737373" android:centerColor="#4c737373" 
      android:centerY="0.50" android:endColor="#ffffd300" /> 

    </shape> 

</rotate> 
+0

謝謝,爲圓形進度條工作。 – 2012-12-26 14:57:24

+2

如果您想要使用drawable,那麼只需在旋轉標籤中使用'android:drawable =',然後移除該形狀。最後是回答旋轉進度條問題的人。 – MinceMan 2014-06-17 16:09:14

+1

它設置顏色,但進度條不旋轉 – Crawler 2015-08-03 08:09:52

52

我在使用不確定的進度對話框與這裏的解決方案有些麻煩,經過一番工作,試驗和錯誤我得到它的工作。

首先,創建要用於進度對話框的動畫。在我的情況下,我使用了5張圖片。

../res/anim/progress_dialog_icon_drawable_animation.xml:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/icon_progress_dialog_drawable_1" android:duration="150" /> 
    <item android:drawable="@drawable/icon_progress_dialog_drawable_2" android:duration="150" /> 
    <item android:drawable="@drawable/icon_progress_dialog_drawable_3" android:duration="150" /> 
    <item android:drawable="@drawable/icon_progress_dialog_drawable_4" android:duration="150" /> 
    <item android:drawable="@drawable/icon_progress_dialog_drawable_5" android:duration="150" /> 
</animation-list> 

當你想顯示ProgressDialog:

dialog = new ProgressDialog(Context.this); 
dialog.setIndeterminate(true); 
dialog.setIndeterminateDrawable(getResources().getDrawable(R.anim.progress_dialog_icon_drawable_animation)); 
dialog.setMessage("Some Text"); 
dialog.show(); 

該解決方案是非常簡單的,對我的工作,你可以擴展ProgressDialog,使它在內部重寫drawable,但是,這對於我所需要的來說太複雜了,所以我沒有這樣做。

+1

感謝您注意「dialog.setIndeterminateDrawable()」 – scottyab 2012-07-19 14:08:03

+1

@bindinduff非常感謝您的解決方案,您爲我節省了大量時間。 – Zeba 2012-08-30 07:39:37

+0

有沒有辦法在對話框中只有一個圖像,所以沒有消息,但在整個對話框中可繪製? – Diego 2013-08-11 20:28:24

6

按比例自定義進度!

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:duration="150"> 
     <scale 
      android:drawable="@drawable/face_no_smile_eyes_off" 
      android:scaleGravity="center" /> 
    </item> 
    <item android:duration="150"> 
     <scale 
      android:drawable="@drawable/face_no_smile_eyes_on" 
      android:scaleGravity="center" /> 
    </item> 
    <item android:duration="150"> 
     <scale 
      android:drawable="@drawable/face_smile_eyes_off" 
      android:scaleGravity="center" /> 
    </item> 
    <item android:duration="150"> 
     <scale 
      android:drawable="@drawable/face_smile_eyes_on" 
      android:scaleGravity="center" /> 
    </item> 

</animation-list>