1. 程式人生 > >Android自定義實現圓形播放進度條

Android自定義實現圓形播放進度條

自定義實現圓形播放進度條(Android,飛一般的感覺)。

廢話不多說,先上效果圖:

Android提供了很多基本的控制元件實現,但不是一個完整、強大的實現。

幸運的是,Android提供了自定義控制元件的實現,有了自定義控制元件,我們就可以再Android的基礎控制元件上實現我們想要的功能或者自定義的外觀。

以ProgressBar為例,對於可調節的進度條似乎只有長條形的ProgressBar(圓形的都是不停轉動的那種)

假如我們想要一個可調節進度的圓形進度條呢。。。

Ok,下面我們直接切入主題(關於自定義控制元件的相關實現細節就不多說了,還不太清楚的童鞋先找相關資料補習一下)

該自定義控制元件的實現思路是繼承自View,然後重寫onDraw

先看看該類有哪些成員變數:

  1. public class CircleProgress extends View{  
  2.      private  static final int DEFAULT_MAX_VALUE = 100;         // 預設進度條最大值   
  3.      private  static final int DEFAULT_PAINT_WIDTH = 10;            // 預設畫筆寬度   
  4.      private  static final int DEFAULT_PAINT_COLOR = 0xffffcc00
    ;        // 預設畫筆顏色   
  5.      private  static final boolean DEFAULT_FILL_MODE = true;        // 預設填充模式   
  6.      private  static final int DEFAULT_INSIDE_VALUE = 0;            // 預設縮排距離   
  7.      private CircleAttribute mCircleAttribute;              // 圓形進度條基本屬性   
  8.      private int mMaxProgress;                      // 進度條最大值                                                                                                                        
      
  9.      private int mMainCurProgress;                      // 主進度條當前值    
  10.      private int mSubCurProgress;                       // 子進度條當前值    
  11.      private CartoomEngine mCartoomEngine;                  // 動畫引擎   
  12.      private Drawable mBackgroundPicture;                   // 背景圖  
  1. class CircleAttribute  
  2.     {  
  3.          public RectF   mRoundOval;             // 圓形所在矩形區域   
  4.          public boolean mBRoundPaintsFill;          // 是否填充以填充模式繪製圓形   
  5.          public int     mSidePaintInterval;         // 圓形向裡縮排的距離   
  6.          public int     mPaintWidth;                // 圓形畫筆寬度(填充模式下無視)   
  7.          public int     mPaintColor;                // 畫筆顏色  (即主進度條畫筆顏色,子進度條畫筆顏色為其半透明值)    
  8.          public int     mDrawPos;               // 繪製圓形的起點(預設為-90度即12點鐘方向)   
  9.          public Paint   mMainPaints;                // 主進度條畫筆          
  10.          public Paint   mSubPaint;                  // 子進度條畫筆    
  11.          public Paint   mBottomPaint;               // 無背景圖時繪製所用畫筆  
  1. class CartoomEngine  
  2. {  
  3.     public Handler mHandler;   
  4.     public boolean mBCartoom;               // 是否正在作動畫    
  5.     public Timer   mTimer;                  // 用於作動畫的TIMER    
  6.     public       MyTimerTask    mTimerTask;     // 動畫任務   
  7.     public int   mSaveMax;              // 在作動畫時會臨時改變MAX值,該變數用於儲存值以便恢復      
  8.     public int     mTimerInterval;              // 定時器觸發間隔時間(ms)        
  9.     public float   mCurFloatProcess;            // 作動畫時當前進度值   

下面看看onDraw的程式碼片段:

  1. public void onDraw(Canvas canvas) {  
  2.         // TODO Auto-generated method stub   
  3.         super.onDraw(canvas);  
  4.         if (mBackgroundPicture == null)                                 // 沒背景圖的話就繪製底色   
  5.         {  
  6.             canvas.drawArc(mCircleAttribute.mRoundOval, 0360, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mBottomPaint);  
  7.         }  
  8.         float subRate = (float)mSubCurProgress / mMaxProgress;  
  9.         float subSweep = 360 * subRate;  
  10.         canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, subSweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mSubPaint);  
  11.         float rate = (float)mMainCurProgress / mMaxProgress;  
  12.         float sweep = 360 * rate;  
  13.         canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, sweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mMainPaints);  
  14.     }  

canvas的drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 方法是關鍵
相關引數說明大家詳看SDK文件

控制元件大小決定oval
畫筆屬性設定paint
useCenter表示是否填充
startAngle是繪製圓弧的起點,我們使用-90度,即12點鐘方向
sweepAngle是從起點順時針繪製覆蓋的角度,意味著進度值為30%的話,就是 360 * 30%

設定進度的程式碼片段:

  1. public synchronized void setMainProgress (int progress)  
  2.  {  
  3.         mMainCurProgress = progress;  
  4.         if (mMainCurProgress < 0)  
  5.         {  
  6.             mMainCurProgress = 0;  
  7.         }  
  8.         if (mMainCurProgress > mMaxProgress)  
  9.         {  
  10.             mMainCurProgress = mMaxProgress;  
  11.         }  
  12.         invalidate();  
  13. }  

設定進度值之後觸發重繪,計算sweepAngle的值,最後完成繪製效果,怎麼樣,是不是就對上了
 
該控制元件的自定義屬性如下:

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. lt;resources>   
  3.    <declare-styleable name="CircleProgressBar">    
  4.        <attr name="max" format="integer"/>                <!-- 進度條最大值 -->  
  5.        <attr name="fill" format="boolean"/>           <!-- 是否填充圓形區域 -->  
  6.        <attr name="Paint_Width" format="integer"/>        <!-- 畫筆寬度,填充模式下無效,會被重置為0 -->  
  7.        <attr name="Paint_Color" format="integer"/>        <!-- 畫筆顏色 -->  
  8.        <attr name="Inside_Interval" format="integer"/> <!-- 圓形區域向裡縮排的距離 -->   
  9.    </declare-styleable>    
  10. lt;/resources>   

再貼上本例的佈局檔案:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:roundProgress="http://schemas.android.com/apk/res/com.genius.progress"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:orientation="vertical"   
  7.     android:background="#ffffff">  
  8.     <LinearLayout   
  9.     android:layout_height="wrap_content"   
  10.     android:layout_width="match_parent"   
  11.     android:id="@+id/linearLayout1"  
  12.     android:orientation="horizontal"  
  13.     android:gravity = "center_horizontal">  
  14.         <Button   
  15.         android:text="增加主進度條"   
  16.         android:id="@+id/buttonAddMainPro"   
  17.         android:layout_width="wrap_content"   
  18.         android:layout_height="wrap_content"  
  19.         android:layout_weight="1">  
  20.         </Button>  
  21.         <Button   
  22.         android:text="增加子進度條"   
  23.         android:id="@+id/buttonAddSubPro"   
  24.         android:layout_width="wrap_content"   
  25.         android:layout_height="wrap_content"  
  26.         android:layout_weight="1">  
  27.         </Button>   
  28.         <ImageButton  
  29.         android:id="@+id/buttonImage"   
  30.         android:layout_width="wrap_content"  
  31.         android:layout_height="wrap_content"  
  32.         android:src="@drawable/background2"  
  33.         android:layout_weight="1" />   
  34.     </LinearLayout>  
  35.     <LinearLayout   
  36.         android:layout_height="wrap_content"   
  37.         android:layout_width="match_parent"   
  38.         android:id="@+id/linearLayout2"  
  39.         android:orientation="horizontal"  
  40.         android:background="#ff0000"  
  41.         android:gravity = "center_horizontal">  
  42.         <com.genius.circle.CircleProgress  
  43.         android:id="@+id/roundBar1"  
  44.         android:layout_width="wrap_content"    
  45.         android:layout_height="wrap_content"  
  46.         android:background="@drawable/background1"     
  47.         roundProgress:max="100"  
  48.         roundProgress:fill = "false"      
  49.         roundProgress:Inside_Interval="5"  
  50.         roundProgress:Paint_Width = "4"  
  51.         roundProgress:Paint_Color = "0xff0000ff"   
  52.         />  
  53.         <com.genius.circle.CircleProgress   
  54.          android:id="@+id/roundBar2"  
  55.          android:layout_width="wrap_content"    
  56.          android:layout_height="wrap_content"  
  57.          android:background="@drawable/background3"        
  58.          roundProgress:max="100"  
  59.          roundProgress:Inside_Interval="8"  
  60.          roundProgress:fill = "true"      
  61.          roundProgress:Paint_Width = "4"                   
  62.          roundProgress:Paint_Color = "0xffaa5500"   
  63.         />  
  64.         <com.genius.circle.CircleProgress   
  65.          android:id="@+id/roundBar3"  
  66.          android:layout_width="96dp"    
  67.          android:layout_height="96dp"     
  68.          roundProgress:max="100"  
  69.          roundProgress:fill="false"  
  70.           roundProgress:Paint_Width="40"        
  71.          roundProgress:Inside_Interval="20"  
  72.         />  
  73.     </LinearLayout>  
  74.     <LinearLayout   
  75.     android:layout_height="wrap_content"   
  76.     android:layout_width="match_parent"   
  77.     android:id="@+id/linearLayout3"  
  78.     android:orientation="horizontal"  
  79.     android:gravity = "center_horizontal|center_vertical"  
  80.     android:background="#00ff00">    
  81.             <Button   
  82.             android:text="啟動動畫"   
  83.             android:id="@+id/buttonStart"   
  84.             android:layout_width="100dip"   
  85.             android:layout_height="wrap_content">  
  86.             </Button>  
  87.             <com.genius.circle.CircleProgress   
  88.              android:id="@+id/roundBar4"  
  89.              android:layout_width="wrap_content"    
  90.              android:layout_height="wrap_content"  
  91.              android:background="@drawable/background1"        
  92.              roundProgress:Inside_Interval="6"  
  93.              roundProgress:Paint_Color = "0xff0000ff"   
  94.             />  
  95.             <Button   
  96.             android:text="停止動畫"   
  97.             android:id="@+id/buttonStop"   
  98.             android:layout_width="100dip"   
  99.             android:layout_height="wrap_content">  
  100.             </Button>  
  101.     </LinearLayout>  
  102. </LinearLayout>  

大家比對下效果圖就明白了

此外該控制元件中有兩個介面是作動畫相關的

public synchronized void  startCartoom(int time)

public synchronized void  stopCartoom()

比如你想播放一個10秒的聲音片段,同時用進度條來表示播放進度,那麼直接呼叫 startCartoom(10)來開啟動畫即可

其他的似乎沒啥好說的了,原始碼工程裡的註釋也寫很清楚了,有興趣的童鞋下下來看看就明白了

附屬工程連結:

具體下載目錄在 /2012年資料/6月/23日/Android自定義實現圓形播放進度條


相關推薦

Android定義實現圓形播放進度

自定義實現圓形播放進度條(Android,飛一般的感覺)。 廢話不多說,先上效果圖: Android提供了很多基本的控制元件實現,但不是一個完整、強大的實現。 幸運的是,Android提供了自定義控制元件的實現,有了自定義控制元件,我們就可以再Androi

Android 定義View 圓形百分比進度

Android 自定義View  圓形百分比進度條 自定義View package com.arch.circleprogressview; import android.content.Context; import android.graphics.Canvas;

Android定義控制元件:進度的四種實現方式

Progress Wheel為GitHub熱門專案,作者是:Todd-Davies,專案地址: https://github.com/Todd-Davies/ProgressWheel 前三種實現方式程式碼出自: http://stormzhang.com/ope

定義實現橫向圓角進度——簡易版

UI 說需要實現這樣圓角橫向進度條,好,於是我就去屁顛屁顛的 Google。下面就是我的辛酸歷程。 1、 設定 ProgressBar 的 android:progressDrawable 屬性 首先找到的一種實現方法就是為 ProgressBar 設定 a

Android定義可拖動進度__SeekBar

Android裡自帶的進度條滿足不了我們的需求,在這篇文章中,我們拖動的滑塊為自定義的一張圖片,背景也是自己定義的,廢話不多說,先上效果圖: 1.先在project的drawable下定義一個layer-list的xml檔案作為背景 <?xml vers

Android定義View畫圓+進度+定義View梯形

//自定義進度圓圈 package com.bw.20171104; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas

我的Android進階之旅------>Android如何通過定義SeekBar來實現視訊播放進度

首先來看一下效果圖,如下所示:其中進度條如下:接下來說一說我的思路,上面的進度拖動條有自定義的Thumb,在Thumb正上方有一個PopupWindow視窗,窗口裡面顯示當前的播放時間。在SeekBar右邊有一個文字框顯示當前播放時間/總時間。step1、先來看一看Popup

定義View實現圓形水波進度

每次聽到某大牛談論自定義View,頓時敬佩之心,如滔滔江水連綿不絕,心想我什麼時候能有如此境界,好了,心動不如行動,於是我開始了自定義View之路,雖然過程有坎坷,但是結果我還是挺滿意的。我知道大牛還遙不可及,但是我已使出洪荒之力。此篇部落格記錄本人初入自定義View之路。 既

Android定義View-圓形進度

好幾天不寫部落格了,這段時間一直沒時間,感覺一直在忙,但是進度不大。 好了,言歸正傳,最近專案裡要用到這麼一個自定義view,是一個圓形的進度圓環,現在學習下怎麼來自定義它。 原始碼下載地址 自定義之前先分析一下,這個自定義View主要有以下幾

Android 定義view --圓形百分比(進度

注:本文由於是在學習過程中寫的,存在大量問題(overdraw onDraw new物件),請讀者們不要被誤導!!解決辦法見後面的部落格。 起因 最近公司專案有需求需要用到輕量級圖表如下

Android定義View--圓形進度RoundProgress

要實現的效果 需要知道的知識點 字型的高度和寬度是怎麼測? 字型的高度就是textSize的大小。 字型的寬度怎麼測量呢?Paint畫筆中有測量字型寬度的api,如下: //測量字型的寬度 float width =

Android 定義 View 圓形進度總結

Android 自定義圓形進度條總結 最近擼了一個圓形進度條的開源專案,算是第一次完完整整的使用自定義 View 。在此對專案開發思路做個小結,歡迎大家 Star 和 Fork 該專案總共實現了三種圓形進度條效果 CircleProgress:圓形進度條,可以實現仿 QQ

定義View實現圓形水波進度(上)

來源:伯樂線上專欄作者 - Code4Android 連結:http://android.jobbole.com/84776/ 每次聽到某大牛談論自定義View,頓時敬佩之心,如滔滔江水連綿不絕,心想我什麼時候能有如此境界,好了,心動不如行動,於是我開始了自定義View之路,雖然過程有坎坷,但是

Android 定義View -- 圓形進度,文字旋轉

最近公司招聘打個廣告: 公司屬於外企福利待遇好, 每週英語課, 關鍵時單身妹子多[色][色] 詳情 [點選全棧JavaScript工程師] Android 自定義View – 圓形進度條,文字旋轉 作為一名

Android定義View——圓形進度式按鈕

介紹 今天上班的時候有個哥們問我怎麼去實現一個按鈕式的進度條,先來看看他需要實現的效果圖。 和普通的圓形進度條類似,只是中間的地方有兩個狀態表示,未開始,暫停狀態。而且他說圓形進度的功能已經實現了。那麼我們只需要對中間的兩個狀態做處理就行了。 先來看看

定義View實現圓形水波進度(下)

來源:伯樂線上專欄作者 - Code4Android 連結:http://android.jobbole.com/84776/ 接上文 通過效果圖,我們看到實現此效果就是不斷的更新進度值,然後重繪,,那麼我們只需開啟一個執行緒實現更新進度值,為了更好的控制我們再

小程序開發如何實現視頻或音頻定義可拖拽進度

text 完成 我們 控制 轉載 產品 結構 可拖拽 step 程序原生組件的音頻播放時並沒有進度條的顯示,而此次在我們所接的項目中,鑒於原生的視頻進度條樣式太醜,產品要求做一個可拖拽的進度條滿足需求。視頻和音頻提供的api大致是相似的,可以根據以下代碼修改為與音頻相關的進

Android繪圖:定義View之——矩形進度、圓環進度、填充型進度、時鐘

主函式 這幾種進度條的主函式都是類似的,所以下面我只給出了一個填充型進度條的主函式,其他幾個主函式只是在這基礎上改動一下按鈕id(即與各自佈局裡面的id相同即可),還有改動一下相對應的類即可。 public class MainActivity

Android閃屏頁圓形倒計時進度實現

前言 現在我們的App中基本都會有閃屏頁面,而閃屏頁中大多又都會加入廣告資訊或者我們自己logo等宣傳圖片的展示,類似如下效果: 思路 使用自定義View,通過View的重繪方法Invalidate()在onDraw()中不斷繪製不同弧度的圓弧來改

使用 Android Studio定義View03——圓環進度

整理總結自鴻洋的部落格:http://blog.csdn.net/lmj623565791/article/details/24500107 要實現的效果如圖: 分析一下,需要這麼幾個屬性:兩個顏色、一個速度、一個圓環寬度 com.cctvjiatao.customvie