Android編程實(shí)現(xiàn)類(lèi)似于圓形ProgressBar的進(jìn)度條效果
本文實(shí)例講述了Android編程實(shí)現(xiàn)類(lèi)似于圓形ProgressBar的進(jìn)度條效果。分享給大家供大家參考,具體如下:

我們要實(shí)現(xiàn)一個(gè)類(lèi)似于小米分享中的圓形播放進(jìn)度條,android自帶的圓形ProgressBar是默認(rèn)自動(dòng)旋轉(zhuǎn)的,所以無(wú)法實(shí)現(xiàn),于是我們想到了使用自定義一個(gè)View,來(lái)實(shí)現(xiàn)這種效果。
首先來(lái)看看自己定義的View
package cn.easymobi.application.bell.common;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class ProgressView extends View{
private float fArcNum;
private float fMax;
private float density;
public float getDensity() {
return density;
}
public void setDensity(float density) {
this.density = density;
}
public ProgressView(Context context) {
super(context);
}
public ProgressView(Context context,AttributeSet attrs) {
super(context,attrs);
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Paint paint=new Paint();
if(fArcNum>0)
{
paint.setColor(Color.GRAY);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
canvas.drawCircle(40*density/2, 40*density/2, 40*density/2, paint);
}
paint.setColor(Color.YELLOW);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
//paint.setStrokeWidth(2);
RectF rect=new RectF(0, 0, 40*density, 40*density);
canvas.drawArc(rect, -90, fArcNum,true, paint);
paint.setColor(Color.BLACK);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
canvas.drawCircle(40*density/2, 40*density/2, 40*density/2-5, paint);
}
public void setProgress(float num) {
fArcNum = (num/fMax) * 360;
}
public float getfArcNum() {
return fArcNum;
}
public void setfArcNum(float fArcNum) {
this.fArcNum = fArcNum;
}
public float getfMax() {
return fMax;
}
public void setfMax(float fMax) {
this.fMax = fMax;
}
}
我們通過(guò)重寫(xiě)View的onDraw方法,根據(jù)fArcNum好fMax來(lái)判斷當(dāng)前播放到的位置,然后不停的刷新改View就實(shí)現(xiàn)了這個(gè)效果。至于畫(huà)弧,是采用了drawArc方法,然后通過(guò)在其內(nèi)部畫(huà)圓遮蓋多余部分實(shí)現(xiàn)。
下面是MediaPlayer與該View的同步處理,核心代碼如下
// *******************************************************************
// Func: playAudio
//
// by: Sun
// 2011.9.1
// *******************************************************************
public void playAudio(final String path, final ProgressBar pb) {
Thread thread = new Thread(new Runnable() {
public void run() {
try {
if (mpMediaPlayer != null) {
mpMediaPlayer.stop();
mpMediaPlayer.release();
mpMediaPlayer = null;
}
mpMediaPlayer = new MediaPlayer();
mpMediaPlayer.setDataSource(path);
mpMediaPlayer.prepare();
mpMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
pb.setVisibility(ProgressBar.GONE);
frontPv.setfMax(mpMediaPlayer.getDuration());
frontPv.setProgress(0);
mpMediaPlayer.start();
refrash = new Thread(new Runnable() {
public void run() {
try {
while (frontPv.getfArcNum() <= 360 && mpMediaPlayer.isPlaying()) {
if (bIsOver)
break;
frontPv.setProgress(mpMediaPlayer.getCurrentPosition());
Thread.sleep(1000);
mHandle.sendEmptyMessage(MSG_REFRESH_UI);
}
mHandle.sendEmptyMessage(MSG_PLAY_OVER);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
refrash.start();
}
});
}
catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
其中frontPv是我們自己定義的view,最后發(fā)送handler是調(diào)用invalidate方法刷新該 view,mpMediaPlayers是我們定義的MediaPlayer對(duì)象。我們通過(guò)在進(jìn)程中每隔一秒更新frontPv當(dāng)中的fArcNum并且 刷新實(shí)現(xiàn)轉(zhuǎn)動(dòng)的動(dòng)畫(huà)效果。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android多線程+單線程+斷點(diǎn)續(xù)傳+進(jìn)度條顯示下載功能
這篇文章主要介紹了Android多線程+單線程+斷點(diǎn)續(xù)傳+進(jìn)度條顯示下載功能,需要的朋友可以參考下2017-06-06
Android編程實(shí)現(xiàn)捕獲程序異常退出時(shí)的錯(cuò)誤log信息功能詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)捕獲程序異常退出時(shí)的錯(cuò)誤log信息功能,結(jié)合實(shí)例形式分析了Android異常信息捕獲與日志操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08
Android實(shí)現(xiàn)修改狀態(tài)欄背景、字體和圖標(biāo)顏色的方法
本篇文章主要介紹了Android實(shí)現(xiàn)修改狀態(tài)欄背景、字體和圖標(biāo)顏色的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Flutter使用NetworkImage實(shí)現(xiàn)圖像顯示效果
這篇文章主要為大家介紹了如何在Flutter中使用NetworkImage實(shí)現(xiàn)圖像顯示效果,文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)一下吧2022-04-04
Android編程實(shí)現(xiàn)根據(jù)不同日期計(jì)算天數(shù)差的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)根據(jù)不同日期計(jì)算天數(shù)差的方法,涉及Android調(diào)用日期類(lèi)Calendar實(shí)現(xiàn)時(shí)間運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2016-03-03
Android 定位系統(tǒng)(GPS)開(kāi)發(fā)詳解
GPS定位是智能手機(jī)上一個(gè)比較有意思的功能,LBS等服務(wù)都有效的利用了GPS定位功能,本文就跟大家分享下Android開(kāi)發(fā)中的GPS定位知識(shí)2016-07-07
Android開(kāi)發(fā)導(dǎo)入項(xiàng)目報(bào)錯(cuò)Ignoring InnerClasses attribute for an anonym
今天小編就為大家分享一篇關(guān)于Android開(kāi)發(fā)導(dǎo)入項(xiàng)目報(bào)錯(cuò)Ignoring InnerClasses attribute for an anonymous inner class的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Android中獲取網(wǎng)頁(yè)表單中的數(shù)據(jù)實(shí)現(xiàn)思路及代碼
在Android中獲取網(wǎng)頁(yè)里表單中的數(shù)據(jù)具體實(shí)現(xiàn)代碼如下,感興趣的各位可以參考過(guò)下哈,希望對(duì)大家有所幫助2013-06-06
Android自定義實(shí)現(xiàn)側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01

