Android編程實現(xiàn)類似于圓形ProgressBar的進度條效果
本文實例講述了Android編程實現(xiàn)類似于圓形ProgressBar的進度條效果。分享給大家供大家參考,具體如下:
我們要實現(xiàn)一個類似于小米分享中的圓形播放進度條,android自帶的圓形ProgressBar是默認自動旋轉(zhuǎn)的,所以無法實現(xiàn),于是我們想到了使用自定義一個View,來實現(xiàn)這種效果。
首先來看看自己定義的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; } }
我們通過重寫View的onDraw方法,根據(jù)fArcNum好fMax來判斷當前播放到的位置,然后不停的刷新改View就實現(xiàn)了這個效果。至于畫弧,是采用了drawArc方法,然后通過在其內(nèi)部畫圓遮蓋多余部分實現(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對象。我們通過在進程中每隔一秒更新frontPv當中的fArcNum并且 刷新實現(xiàn)轉(zhuǎn)動的動畫效果。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
android studio 清單配置文件androidmainfest.xml詳細解讀
AndroidManifest官方解釋是應用清單,每個應用的根目錄中都必須包含一個,并且文件名必須一模一樣,這個文件中包含了APP的配置信息,系統(tǒng)需要根據(jù)里面的內(nèi)容運行APP的代碼,顯示界面,這篇文章介紹了android studio 清單配置文件androidmainfest.xml解讀,需要的朋友可以參考下2024-04-04Android SharedPreferences實現(xiàn)記住密碼和自動登錄界面
本篇文章主要介紹了Android記住密碼和自動登錄界面的實現(xiàn)(SharedPreferences),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02Android 8.0 中如何實現(xiàn)視頻通話的畫中畫模式的示例
本篇文章介紹了Android 8.0 中如何實現(xiàn)視頻通話的畫中畫模式的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Android關(guān)于Glide的使用(高斯模糊、加載監(jiān)聽、圓角圖片)
這篇文章主要為大家詳細介紹了Android關(guān)于Glide的使用,內(nèi)容豐富,高斯模糊、加載監(jiān)聽、圓角圖片希望大家可以掌握,感興趣的小伙伴們可以參考一下2016-11-11