Android自定義實現圓形播放進度條
自定義實現圓形播放進度條(Android,飛一般的感覺)。
廢話不多說,先上效果圖:
Android提供了很多基本的控制元件實現,但不是一個完整、強大的實現。
幸運的是,Android提供了自定義控制元件的實現,有了自定義控制元件,我們就可以再Android的基礎控制元件上實現我們想要的功能或者自定義的外觀。
以ProgressBar為例,對於可調節的進度條似乎只有長條形的ProgressBar(圓形的都是不停轉動的那種)
假如我們想要一個可調節進度的圓形進度條呢。。。
Ok,下面我們直接切入主題(關於自定義控制元件的相關實現細節就不多說了,還不太清楚的童鞋先找相關資料補習一下)
該自定義控制元件的實現思路是繼承自View,然後重寫onDraw
先看看該類有哪些成員變數:
- public class CircleProgress extends View{
- private static final int DEFAULT_MAX_VALUE = 100; // 預設進度條最大值
- private static final int DEFAULT_PAINT_WIDTH = 10; // 預設畫筆寬度
- private static final int DEFAULT_PAINT_COLOR = 0xffffcc00
- private static final boolean DEFAULT_FILL_MODE = true; // 預設填充模式
- private static final int DEFAULT_INSIDE_VALUE = 0; // 預設縮排距離
- private CircleAttribute mCircleAttribute; // 圓形進度條基本屬性
- private int mMaxProgress; // 進度條最大值
- private int mMainCurProgress; // 主進度條當前值
- private int mSubCurProgress; // 子進度條當前值
- private CartoomEngine mCartoomEngine; // 動畫引擎
- private Drawable mBackgroundPicture; // 背景圖
- class CircleAttribute
- {
- public RectF mRoundOval; // 圓形所在矩形區域
- public boolean mBRoundPaintsFill; // 是否填充以填充模式繪製圓形
- public int mSidePaintInterval; // 圓形向裡縮排的距離
- public int mPaintWidth; // 圓形畫筆寬度(填充模式下無視)
- public int mPaintColor; // 畫筆顏色 (即主進度條畫筆顏色,子進度條畫筆顏色為其半透明值)
- public int mDrawPos; // 繪製圓形的起點(預設為-90度即12點鐘方向)
- public Paint mMainPaints; // 主進度條畫筆
- public Paint mSubPaint; // 子進度條畫筆
- public Paint mBottomPaint; // 無背景圖時繪製所用畫筆
- class CartoomEngine
- {
- public Handler mHandler;
- public boolean mBCartoom; // 是否正在作動畫
- public Timer mTimer; // 用於作動畫的TIMER
- public MyTimerTask mTimerTask; // 動畫任務
- public int mSaveMax; // 在作動畫時會臨時改變MAX值,該變數用於儲存值以便恢復
- public int mTimerInterval; // 定時器觸發間隔時間(ms)
- public float mCurFloatProcess; // 作動畫時當前進度值
下面看看onDraw的程式碼片段:
- public void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- if (mBackgroundPicture == null) // 沒背景圖的話就繪製底色
- {
- canvas.drawArc(mCircleAttribute.mRoundOval, 0, 360, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mBottomPaint);
- }
- float subRate = (float)mSubCurProgress / mMaxProgress;
- float subSweep = 360 * subRate;
- canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, subSweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mSubPaint);
- float rate = (float)mMainCurProgress / mMaxProgress;
- float sweep = 360 * rate;
- canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, sweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mMainPaints);
- }
canvas的drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 方法是關鍵
相關引數說明大家詳看SDK文件
控制元件大小決定oval
畫筆屬性設定paint
useCenter表示是否填充
startAngle是繪製圓弧的起點,我們使用-90度,即12點鐘方向
sweepAngle是從起點順時針繪製覆蓋的角度,意味著進度值為30%的話,就是 360 * 30%
設定進度的程式碼片段:
- public synchronized void setMainProgress (int progress)
- {
- mMainCurProgress = progress;
- if (mMainCurProgress < 0)
- {
- mMainCurProgress = 0;
- }
- if (mMainCurProgress > mMaxProgress)
- {
- mMainCurProgress = mMaxProgress;
- }
- invalidate();
- }
設定進度值之後觸發重繪,計算sweepAngle的值,最後完成繪製效果,怎麼樣,是不是就對上了
該控制元件的自定義屬性如下:
- <?xml version="1.0" encoding="utf-8"?>
- lt;resources>
- <declare-styleable name="CircleProgressBar">
- <attr name="max" format="integer"/> <!-- 進度條最大值 -->
- <attr name="fill" format="boolean"/> <!-- 是否填充圓形區域 -->
- <attr name="Paint_Width" format="integer"/> <!-- 畫筆寬度,填充模式下無效,會被重置為0 -->
- <attr name="Paint_Color" format="integer"/> <!-- 畫筆顏色 -->
- <attr name="Inside_Interval" format="integer"/> <!-- 圓形區域向裡縮排的距離 -->
- </declare-styleable>
- lt;/resources>
再貼上本例的佈局檔案:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- xmlns:roundProgress="http://schemas.android.com/apk/res/com.genius.progress"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- android:background="#ffffff">
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/linearLayout1"
- android:orientation="horizontal"
- android:gravity = "center_horizontal">
- <Button
- android:text="增加主進度條"
- android:id="@+id/buttonAddMainPro"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1">
- </Button>
- <Button
- android:text="增加子進度條"
- android:id="@+id/buttonAddSubPro"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1">
- </Button>
- <ImageButton
- android:id="@+id/buttonImage"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/background2"
- android:layout_weight="1" />
- </LinearLayout>
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/linearLayout2"
- android:orientation="horizontal"
- android:background="#ff0000"
- android:gravity = "center_horizontal">
- <com.genius.circle.CircleProgress
- android:id="@+id/roundBar1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/background1"
- roundProgress:max="100"
- roundProgress:fill = "false"
- roundProgress:Inside_Interval="5"
- roundProgress:Paint_Width = "4"
- roundProgress:Paint_Color = "0xff0000ff"
- />
- <com.genius.circle.CircleProgress
- android:id="@+id/roundBar2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/background3"
- roundProgress:max="100"
- roundProgress:Inside_Interval="8"
- roundProgress:fill = "true"
- roundProgress:Paint_Width = "4"
- roundProgress:Paint_Color = "0xffaa5500"
- />
- <com.genius.circle.CircleProgress
- android:id="@+id/roundBar3"
- android:layout_width="96dp"
- android:layout_height="96dp"
- roundProgress:max="100"
- roundProgress:fill="false"
- roundProgress:Paint_Width="40"
- roundProgress:Inside_Interval="20"
- />
- </LinearLayout>
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/linearLayout3"
- android:orientation="horizontal"
- android:gravity = "center_horizontal|center_vertical"
- android:background="#00ff00">
- <Button
- android:text="啟動動畫"
- android:id="@+id/buttonStart"
- android:layout_width="100dip"
- android:layout_height="wrap_content">
- </Button>
- <com.genius.circle.CircleProgress
- android:id="@+id/roundBar4"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/background1"
- roundProgress:Inside_Interval="6"
- roundProgress:Paint_Color = "0xff0000ff"
- />
- <Button
- android:text="停止動畫"
- android:id="@+id/buttonStop"
- android:layout_width="100dip"
- android:layout_height="wrap_content">
- </Button>
- </LinearLayout>
- </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