最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android編程實(shí)現(xiàn)類似于圓形ProgressBar的進(jìn)度條效果

 更新時(shí)間:2017年03月04日 12:08:14   作者:aloxc  
這篇文章主要介紹了Android編程實(shí)現(xiàn)類似于圓形ProgressBar的進(jìn)度條效果,結(jié)合實(shí)例形式分析了Android通過自定義View實(shí)現(xiàn)圓形進(jìn)度條效果的操作方法,需要的朋友可以參考下

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

我們要實(shí)現(xiàn)一個(gè)類似于小米分享中的圓形播放進(jìn)度條,android自帶的圓形ProgressBar是默認(rèn)自動(dòng)旋轉(zhuǎn)的,所以無法實(shí)現(xiàn),于是我們想到了使用自定義一個(gè)View,來實(shí)現(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來判斷當(dāng)前播放到的位置,然后不停的刷新改View就實(shí)現(xiàn)了這個(gè)效果。至于畫弧,是采用了drawArc方法,然后通過在其內(nèi)部畫圓遮蓋多余部分實(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對象。我們通過在進(jìn)程中每隔一秒更新frontPv當(dāng)中的fArcNum并且 刷新實(shí)現(xiàn)轉(zhuǎn)動(dòng)的動(dòng)畫效果。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評論

桃园市| 拉孜县| 舟山市| 通江县| 台北市| 万年县| 武强县| 莱芜市| 鹤庆县| 共和县| 黄浦区| 禹州市| 茶陵县| 石阡县| 三亚市| 洞头县| 哈尔滨市| 永登县| 寿光市| 民乐县| 新巴尔虎左旗| 丽水市| 重庆市| 兰考县| 调兵山市| 尚义县| 团风县| 庄河市| 罗城| 万全县| 招远市| 温泉县| 若尔盖县| 大安市| 沛县| 河池市| 石阡县| 绥宁县| 石河子市| 泽普县| 屯留县|