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

Android自定義View實(shí)現(xiàn)音頻播放圓形進(jìn)度條

 更新時(shí)間:2018年06月29日 08:34:52   作者:魯提轄_Ga  
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)音頻播放圓形進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本篇文章介紹自定義View配合屬性動(dòng)畫來實(shí)現(xiàn)如下的效果

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

  • 根據(jù)播放按鈕的圖片大小計(jì)算出圓形進(jìn)度條的大小
  • 根據(jù)音頻的時(shí)間長度計(jì)算出圓形進(jìn)度條繪制的弧度
  • 通過Handler刷新界面來更新圓形進(jìn)度條的進(jìn)度

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

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

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

  //畫筆
  private Paint mPaint;

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

  //最大進(jìn)度值
  private int mMaxProcessValue = 100;

  //進(jìn)度值
  private int mProcessValue;

  private int width;

  private int height;

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

  //播放器按鈕Bitmap對(duì)象
  private Bitmap drawBitmapPlay;
  private Bitmap drawBitmapStop;

  private Context context;
  //標(biāo)記是否正在播放中
  private boolean isPlay;

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

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中新建如下:

<declare-styleable name="circle_progress_image_attrs">
    <attr name="play_image" format="reference"/>
    <attr name="stop_image" format="reference"/>
  </declare-styleable>

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

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

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

@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;
  }

獲取播放器按鈕圖片的大小后,計(jì)算出進(jìn)度條的相應(yīng)的坐標(biāo)放入RectF對(duì)象中,RectF對(duì)象是用來表示坐標(biāo)系中的一塊矩形區(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);
    }
  }

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

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

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

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

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();
  }

音頻播放的邏輯實(shí)現(xiàn)部分因?yàn)椴粚儆谧远xview因此可以自行參考demo

代碼示例: CustomViewSamples

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android平臺(tái)中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的5種方式

    Android平臺(tái)中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的5種方式

    這篇文章主要為大家分享了介紹了Android平臺(tái)中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)技術(shù)的5種方式,供大家學(xué)習(xí),感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android 自定義ContentProvider簡單實(shí)例

    Android 自定義ContentProvider簡單實(shí)例

    這篇文章主要介紹了Android 自定義ContentProvider簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Android 詳解自定義圓角輸入框和按鈕的實(shí)現(xiàn)流程

    Android 詳解自定義圓角輸入框和按鈕的實(shí)現(xiàn)流程

    對(duì)于安卓程序員來說,自定義view簡直不要太重要,畢竟有很多功能,譬如圓形頭像這些,用單純的原生非常難以實(shí)現(xiàn),而用自定義view,簡直分分鐘,今天我們來實(shí)現(xiàn)自定義圓角輸入框和按鈕,大家可以跟著練習(xí),掌握技巧
    2021-11-11
  • Android實(shí)現(xiàn)懸浮圖片

    Android實(shí)現(xiàn)懸浮圖片

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)懸浮圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • android 7自定義相機(jī)預(yù)覽及拍照功能

    android 7自定義相機(jī)預(yù)覽及拍照功能

    這篇文章主要為大家詳細(xì)介紹了android 7自定義相機(jī)預(yù)覽及拍照功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android連接MySQL數(shù)據(jù)庫詳細(xì)教程

    Android連接MySQL數(shù)據(jù)庫詳細(xì)教程

    在Android應(yīng)用程序中連接 MySQL 數(shù)據(jù)庫可以幫助開發(fā)人員實(shí)現(xiàn)更豐富的數(shù)據(jù)管理功能,本教程將介紹如何在Android應(yīng)用程序中使用低版本的MySQL Connector/J驅(qū)動(dòng)程序來連接MySQL數(shù)據(jù)庫,需要的朋友可以參考下
    2023-05-05
  • Android實(shí)現(xiàn)系統(tǒng)重新啟動(dòng)的功能

    Android實(shí)現(xiàn)系統(tǒng)重新啟動(dòng)的功能

    有些Android版本沒有系統(tǒng)重啟的功能,非常不方便。需要我們自己開發(fā)一個(gè)能夠重新啟動(dòng)的應(yīng)用
    2013-11-11
  • Android Studio實(shí)現(xiàn)簡單計(jì)算器APP

    Android Studio實(shí)現(xiàn)簡單計(jì)算器APP

    這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡單計(jì)算器APP,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Android中CountDownTimer類詳解

    Android中CountDownTimer類詳解

    本文詳細(xì)講解了Android中CountDownTimer類,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Android實(shí)現(xiàn)單頁面浮層可拖動(dòng)view的一種方法

    Android實(shí)現(xiàn)單頁面浮層可拖動(dòng)view的一種方法

    本篇文章主要介紹了Android實(shí)現(xiàn)單頁面浮層可拖動(dòng)view的一種方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10

最新評(píng)論

天等县| 文昌市| 子洲县| 北碚区| 汤阴县| 茶陵县| 吉隆县| 剑川县| 西盟| 曲阳县| 潜江市| 扶风县| 阿图什市| 界首市| 黔西县| 蕲春县| 文安县| 齐齐哈尔市| 镇原县| 玉屏| 三台县| 武强县| 乐清市| 中宁县| 丹江口市| 泽库县| 杨浦区| 大悟县| 偃师市| 麟游县| 铜梁县| 西乡县| 平昌县| 信宜市| 剑川县| 鹤壁市| 锡林浩特市| 原阳县| 灵丘县| 东宁县| 海淀区|