真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

怎么在Android中自定義View實現(xiàn)音頻播放圓形進度條-創(chuàng)新互聯(lián)

這期內容當中小編將會給大家?guī)碛嘘P怎么在Android中自定義View實現(xiàn)音頻播放圓形進度條,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是專業(yè)的馬龍網站建設公司,馬龍接單;提供成都做網站、成都網站制作、成都外貿網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行馬龍網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!

實現(xiàn)思路如下:

  • 根據播放按鈕的圖片大小計算出圓形進度條的大小

  • 根據音頻的時間長度計算出圓形進度條繪制的弧度

  • 通過Handler刷新界面來更新圓形進度條的進度

具體實現(xiàn)過程分析:

首先來看看自定義View中定義的一些成員變量

 //表示坐標系中的一塊矩形區(qū)域
  private RectF mRectF;

  //畫筆
  private Paint mPaint;

  //畫筆寬度
  private int mCircleStoreWidth = 3;

  //大進度值
  private int mMaxProcessValue = 100;

  //進度值
  private int mProcessValue;

  private int width;

  private int height;

  //播放器按鈕id值
  private int bitmapPlay;
  private int bitmapStop;

  //播放器按鈕Bitmap對象
  private Bitmap drawBitmapPlay;
  private Bitmap drawBitmapStop;

  private Context context;
  //標記是否正在播放中
  private boolean isPlay;

初始化自定義View,在這里獲取播放器按鈕圖片以及初始化畫布畫筆對象以及設置將畫筆設置抗鋸齒

private void init(Context context, AttributeSet attrs, int defStyleAttr) {
    this.context = context;
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.circle_progress_image_attrs);
    bitmapPlay = a.getResourceId(R.styleable.circle_progress_image_attrs_play_image, R.mipmap.play_button);
    bitmapStop = a.getResourceId(R.styleable.circle_progress_image_attrs_stop_image, R.mipmap.stop_button);
    a.recycle();
    drawBitmapPlay = BitmapFactory.decodeResource(context.getResources(), bitmapPlay);
    drawBitmapStop = BitmapFactory.decodeResource(context.getResources(), bitmapStop);
    mRectF = new RectF();
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
  }

這里使用了自定義attrs來獲取播放器按鈕圖片

在attrs.xml中新建如下:


    
    
  

然后在xml布局的自定義View中加入就能獲取圖片的id值了

 circle:play_image="@mipmap/play_button"
 circle:stop_image="@mipmap/stop_button"

然后我們重寫onMeasure()來測量圓形進度條繪制的位置

@Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = measureWidth(widthMeasureSpec);
    height = measureWidth(heightMeasureSpec);
    mRectF.left = width / 2 - drawBitmapPlay.getWidth() / 2;
    mRectF.top = height / 2 - drawBitmapPlay.getHeight() / 2;
    mRectF.right = width / 2 + drawBitmapPlay.getWidth() / 2;
    mRectF.bottom = height / 2 + drawBitmapPlay.getHeight() / 2;
  }
  public int measureWidth(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);
    if (specMode == MeasureSpec.EXACTLY) {
      result = specSize;
    } else {
      result = 200;
      if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(specSize, result);
      }
    }
    return result;
  }

獲取播放器按鈕圖片的大小后,計算出進度條的相應的坐標放入RectF對象中,RectF對象是用來表示坐標系中的一塊矩形區(qū)域,用于在特定的位置畫圖

然后我們就可以通過重寫onDraw()方法來繪制View了

@Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.TRANSPARENT);
    //畫圓
    mPaint.setColor(ContextCompat.getColor(context, R.color.orange));
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mCircleStoreWidth);
    //    canvas.drawArc(mRectF, -90, 360, false, mPaint);
    mPaint.setColor(ContextCompat.getColor(context, R.color.gray));
    canvas.drawArc(mRectF, -90, ((float) mProcessValue / mMaxProcessValue) * 360, false, mPaint);
    Log.d(TAG, ((float) mProcessValue / mMaxProcessValue) * 360 + "");
    float imageLeft = width / 2 - drawBitmapPlay.getWidth() / 2;
    float imageTop = height / 2 - drawBitmapPlay.getHeight() / 2;
    if (isPlay) {
      canvas.drawBitmap(drawBitmapStop, imageLeft, imageTop, mPaint);
    } else {
      canvas.drawBitmap(drawBitmapPlay, imageLeft, imageTop, mPaint);
    }
  }

要點其實就是canvas.drawArc()方法在RecfF的位置里畫弧形,通過音頻播放的開始時間/總時間*360來計算出弧度
要注意的是每次調用onDraw()方法的時候都需要先將canvas畫透明色來起到清屏的作用

通過handler來每150毫秒刷新一次界面

private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
      switch (msg.what) {
        case 1:
          //定時更新界面
          if (isPlay) {
            mProcessValue += 150;
            if (mProcessValue == mMaxProcessValue) {
              isPlay = false;
            }
            invalidate();
            Message message = handler.obtainMessage(1);
            handler.sendMessageDelayed(message, 150);
          }
      }
      super.handleMessage(msg);
    }
  };

最后是一些包裝方法,很簡單不仔細介紹了

public void play() {
    isPlay = true;
    Message message = handler.obtainMessage(1);
    handler.sendMessageDelayed(message, 150);
  }

  public void setDuration(int duration) {
    this.mMaxProcessValue = duration;
  }

  public void clearDuration() {
    this.mMaxProcessValue = 0;
    this.mProcessValue = 0;
  }

  public void pause() {
    isPlay = false;
    invalidate();
  }

  public void stop() {
    isPlay = false;
    this.mMaxProcessValue = 0;
    this.mProcessValue = 0;
    invalidate();
  }

上述就是小編為大家分享的怎么在Android中自定義View實現(xiàn)音頻播放圓形進度條了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文題目:怎么在Android中自定義View實現(xiàn)音頻播放圓形進度條-創(chuàng)新互聯(lián)
標題來源:http://weahome.cn/article/cdpigd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部