Android簡單自定義圓形和水平ProgressBar


ProgressBar簡介

繼承於View類,直接子類有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子類有SeekBar和RatingBar,可見這二者也是基於ProgressBar實現的。

 

1、ProgressBar有兩個進度,一個是Android:progress,另一個是android:secondaryProgress。后者主要是為緩存需要所涉及的,比如在看網絡視頻時候都會有一個緩存的進度條以及還要一個播放的進度,在這里緩存的進度就可以是android:secondaryProgress,而播放進度就是android:progress,有了secondProgress,可以很方便定制ProgressBar。

 2、ProgressBar分為確定的和不確定的,確定的是我們能明確看到進度,相反不確定的就是不清楚、不確定一個操作需要多長時間來完成,這個時候就需要用的不確定的ProgressBar了。屬性android:indeterminate如果設置為true的話,那么ProgressBar就可能是圓形的滾動條或者水平的滾動條(由樣式決定),但是我們一般時候,是直接使用Style類型來區分圓形還是水平ProgressBar的。

3、ProgressBar的樣式設定其實有兩種方式,在API文檔中說明的方式如下:

 

  • Widget.ProgressBar.Horizontal
  • Widget.ProgressBar.Small
  • Widget.ProgressBar.Large
  • Widget.ProgressBar.Inverse
  • Widget.ProgressBar.Small.Inverse
  • Widget.ProgressBar.Large.Inverse

  使用的時候可以這樣:style="@android:style/Widget.ProgressBar.Small",另外還有一種方式就是使用系統的attr,下面的方式是系統的style:

 

 

  • style="?android:attr/progressBarStyle" 
  • style="?android:attr/progressBarStyleHorizontal" 
  • style="?android:attr/progressBarStyleInverse" 
  • style="?android:attr/progressBarStyleLarge" 
  • style="?android:attr/progressBarStyleLargeInverse" 
  • style="?android:attr/progressBarStyleSmall" 
  • style="?android:attr/progressBarStyleSmallInverse" 
  • style="?android:attr/progressBarStyleSmallTitle" 
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <ProgressBar  
  2.      android:id="@+id/progressBar1"  
  3.      style="?android:attr/progressBarStyleHorizontal"  
  4.      style="@android:style/Widget.ProgressBar.Horizontal"(等同於@android:attr)  
  5.      android:layout_width="match_parent"  
  6.      android:layout_height="wrap_content" />  

水平ProgressBar系統樣式

我們去看一下style="?android:attr/progressBarStyleHorizontal"的源碼,如下:

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <pre name="code" class="java">    <style name="Widget.ProgressBar.Horizontal">  
  2.         <item name="android:indeterminateOnly">false</item>  
  3.         <item name="android:progressDrawable">@android:drawable/progress_horizontal</item>  
  4.         <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>  
  5.         <item name="android:minHeight">20dip</item>  
  6.         <item name="android:maxHeight">20dip</item>  
  7.         <item name="android:mirrorForRtl">true</item>  
  8.     </style>  
 
        

一眼看出android:progressDrawable便是主角,繼續看一下progress_horizontal的源碼,如下:

 

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!-- Copyright (C) 2008 The Android Open Source Project  
  3.   
  4.      Licensed under the Apache License, Version 2.0 (the "License");  
  5.      you may not use this file except in compliance with the License.  
  6.      You may obtain a copy of the License at  
  7.   
  8.           http://www.apache.org/licenses/LICENSE-2.0  
  9.   
  10.      Unless required by applicable law or agreed to in writing, software  
  11.      distributed under the License is distributed on an "AS IS" BASIS,  
  12.      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  13.      See the License for the specific language governing permissions and  
  14.      limitations under the License.  
  15. -->  
  16.   
  17. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">  
  18.      
  19.     <item android:id="@android:id/background">  
  20.         <shape>  
  21.             <corners android:radius="5dip" />  
  22.             <gradient  
  23.                     android:startColor="#ff9d9e9d"  
  24.                     android:centerColor="#ff5a5d5a"  
  25.                     android:centerY="0.75"  
  26.                     android:endColor="#ff747674"  
  27.                     android:angle="270"  
  28.             />  
  29.         </shape>  
  30.     </item>  
  31.      
  32.     <item android:id="@android:id/secondaryProgress">  
  33.         <clip>  
  34.             <shape>  
  35.                 <corners android:radius="5dip" />  
  36.                 <gradient  
  37.                         android:startColor="#80ffd300"  
  38.                         android:centerColor="#80ffb600"  
  39.                         android:centerY="0.75"  
  40.                         android:endColor="#a0ffcb00"  
  41.                         android:angle="270"  
  42.                 />  
  43.             </shape>  
  44.         </clip>  
  45.     </item>  
  46.      
  47.     <item android:id="@android:id/progress">  
  48.         <clip>  
  49.             <shape>  
  50.                 <corners android:radius="5dip" />  
  51.                 <gradient  
  52.                         android:startColor="#ffffd300"  
  53.                         android:centerColor="#ffffb600"  
  54.                         android:centerY="0.75"  
  55.                         android:endColor="#ffffcb00"  
  56.                         android:angle="270"  
  57.                 />  
  58.             </shape>  
  59.         </clip>  
  60.     </item>  
  61.      
  62. </layer-list>  

 

這里面有3個item,分別為:background、secondProgress、progress,看名字就能知道其大概作用,我們比較關心的應該是后兩個,其實把這個文件copy一份到自己的項目下,就可以隨心所欲的修改shape屬性:圓角、漸變等等。

 

 

自定義水平ProgressBar

第一步,在drawable文件夾下新建一個progressbar_horizontal_1.xml:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <!-- background -->  
  5.     <item  
  6.         android:id="@android:id/background"  
  7.         android:drawable="@drawable/progress_patch_green">  
  8.     </item>  
  9.     <!-- progress -->  
  10.     <item android:id="@android:id/progress">  
  11.         <clip>  
  12.             <nine-patch android:src="@drawable/progress_patch_galy" />  
  13.         </clip>  
  14.     </item>  
  15.     <!-- second progress -->  
  16.   
  17.     <item android:id="@android:id/secondaryProgress">  
  18.         <clip>  
  19.             <nine-patch android:src="@drawable/progresspatch_blue" />  
  20.         </clip>  
  21.     </item>  
  22.   
  23. </layer-list>  

 

上圖中的progress和secondprogress中src的資源便是我自定義的,注意這三個之間的疊放順序,background是最底層,中間的是progress最上層是second。

 

第二步,標准一點,在style中新建我們自定義的style:mProgress_horizontal:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <style name="mProgress_horizontal">  
  2.     <item name="android:indeterminateOnly">false</item>  
  3.     <item name="android:progressDrawable">@drawable/progressbar_horizontal_1</item><!-- progress_horizontal -->  
  4.     <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>  
  5.     <item name="android:minHeight">20dip</item>  
  6.     <item name="android:maxHeight">20dip</item>  
  7. </style>  

 

上圖中prpgressDrawable資源便是指向了我們自定義的progressbar_horizontal_1,大功告成。

 

第三步,組件引用:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <ProgressBar  
  2.     android:id="@+id/progressBar1"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="@drawable/progress_backround"  
  6.     android:padding="5dp"  
  7.     android:progress="50"  
  8.     style="@style/mProgress_horizontal"  
  9.     android:secondaryProgress="20"  
  10.     android:visibility="visible" />  

 

【附】

 

在這里我們也可以省略第二步創建style,直接在組件中android:progressDrawable引用自己的progressbar_horizontal_1,如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <ProgressBar  
  2.     android:id="@+id/progressBar1"  
  3.     android:indeterminate="false"  
  4.     android:indeterminateOnly="false"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="wrap_content"  
  7.     android:background="@drawable/progress_backround"  
  8.     android:padding="5dp"  
  9.     android:progress="50"  
  10.     android:maxHeight="20dp"  
  11.     android:minHeight="20dp"  
  12.     android:progressDrawable="@drawable/progressbar_horizontal_1"  
  13.     android:secondaryProgress="20"  
  14.     />  

 

 

 

第四步,效果圖:

 

 

圓形ProgressBar系統樣式

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <ProgressBar  
  2.     android:id="@+id/progressBar2"  
  3.     style="@android:attr/progressBarStyleLarge"  
  4.     android:layout_gravity="center_vertical"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="wrap_content" />  

 

我們以progressBarStyleLarge為例進行探索,找到這個布局文件,源碼如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <style name="Widget.ProgressBar.Large">  
  2.   <item name="android:indeterminateDrawable">@android:drawable/progress_large_white</item>  
  3.   <item name="android:minWidth">76dip</item>  
  4.   <item name="android:maxWidth">76dip</item>  
  5.   <item name="android:minHeight">76dip</item>  
  6.   <item name="android:maxHeight">76dip</item>  
  7. </style>  

 

同樣一眼看出indeterminateDrawable便是主角了,繼續看一下progress_large_white源碼,如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <rotate xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:drawable="@drawable/spinner_white_76"  
  3.     android:pivotX="50%"  
  4.     android:pivotY="50%"  
  5.     android:fromDegrees="0"  
  6.     android:toDegrees="360" />  

 

看到這里就透徹了,就是在這里spinner_white_76進行不停的旋轉的,我們copy一下這個文件,就可以直接自定義了。

 

 

 

自定義圓形ProgressBar

第一步,在drawable文件夾下新建:progressbar_circle_1.xml,如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <rotate xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:drawable="@drawable/loading" //自定義的菊花圖片  
  4.     android:fromDegrees="0"  
  5.     android:pivotX="50%"  
  6.     android:pivotY="50%"  
  7.     android:toDegrees="360" >  
  8.   
  9. </rotate>  

 

第二步,在Style中定義mProgress_circle,如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <style name="mProgress_circle">  
  2.     <item name="android:indeterminateDrawable">@drawable/progressbar_circle_1</item>  
  3.     <item name="android:minWidth">25dp</item>  
  4.     <item name="android:minHeight">25dp</item>  
  5.     <item name="android:maxWidth">60dp</item>  
  6.     <item name="android:maxHeight">60dp</item>  
  7. </style>  

 

支持大小自己隨意定,別失真就好

 

第三步,組件中引用,如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <ProgressBar  
  2.     android:id="@+id/progressBar2"  
  3.     style="@style/mProgress_circle"  
  4.     android:layout_gravity="center_vertical"  
  5.     android:layout_width="match_parent"  
  6.     android:indeterminateDuration="1200"  
  7.     android:layout_height="wrap_content" />  

 

【附】
上面是通過一張圖片填充android:indeterminateDrawable,我們也可以定義一個動畫或者自定義顏色(shape)來實現,跟圖片的用法一樣:

 

定義動畫 progress_circle_loading,xml:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <animation-list android:oneshot="false"    
  3.   xmlns:android="http://schemas.android.com/apk/res/android">    
  4.   <item android:duration="100" android:drawable="@drawable/loading_1" />    
  5.   <item android:duration="100" android:drawable="@drawable/loading_2" />    
  6.   <item android:duration="100" android:drawable="@drawable/loading_3" />    
  7.   <item android:duration="100" android:drawable="@drawable/loading_4" />    
  8.   <item android:duration="100" android:drawable="@drawable/loading_5" />    
  9.   <item android:duration="100" android:drawable="@drawable/loading_6" />  
  10. </animation-list>  

 

style的indeterminateDrawable引入:

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <pre name="code" class="java"><item name="android:indeterminateDrawable">@drawable/progress_circle_loading</item>  
 
        

 

定義shape顏色 progress_circle_shape.xml

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <rotate xmlns:android="http://schemas.android.com/apk/res/android"    
  3.   android:fromDegrees="0"    
  4.   android:pivotX="50%"    
  5.   android:pivotY="50%"    
  6.   android:toDegrees="360" >    
  7.   <shape    
  8.     android:innerRadiusRatio="3"    
  9.     android:shape="ring"    
  10.     android:thicknessRatio="8"    
  11.     android:useLevel="false" >    
  12.     <gradient    
  13.       android:centerColor="#FFFFFF"    
  14.       android:centerY="0.50"    
  15.       android:endColor="#1E90FF"    
  16.       android:startColor="#000000"    
  17.       android:type="sweep"    
  18.       android:useLevel="false" />    
  19.   </shape>    
  20. </rotate>  

 


style的indeterminateDrawable引入:

 

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <item name="android:indeterminateDrawable">@drawable/progress_circle_shape</item>  

 

 

效果圖如下:

 

 

 

 

SeekBar的原理是一樣的,不信你看下圖,我就是用的seekbar

 

最后來張全家福:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM