当前位置: 首页 > 编程笔记 >

Android编程实现类似于圆形ProgressBar的进度条效果

濮阳功
2023-03-14
本文向大家介绍Android编程实现类似于圆形ProgressBar的进度条效果,包括了Android编程实现类似于圆形ProgressBar的进度条效果的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了Android编程实现类似于圆形ProgressBar的进度条效果。分享给大家供大家参考,具体如下:

我们要实现一个类似于小米分享中的圆形播放进度条,android自带的圆形ProgressBar是默认自动旋转的,所以无法实现,于是我们想到了使用自定义一个View,来实现这种效果。

首先来看看自己定义的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方法,根据fArcNum好fMax来判断当前播放到的位置,然后不停的刷新改View就实现了这个效果。至于画弧,是采用了drawArc方法,然后通过在其内部画圆遮盖多余部分实现。

下面是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,最后发送handler是调用invalidate方法刷新该 view,mpMediaPlayers是我们定义的MediaPlayer对象。我们通过在进程中每隔一秒更新frontPv当中的fArcNum并且 刷新实现转动的动画效果。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

 类似资料:
  • 本文向大家介绍Android实现自定义圆形进度条,包括了Android实现自定义圆形进度条的使用技巧和注意事项,需要的朋友参考一下 今天无意中发现一个圆形进度,想想自己实现一个,如下图: 基本思路是这样的: 1.首先绘制一个实心圆 2.绘制一个白色实心的正方形,遮住实心圆 3.在圆的中心动态绘制当前进度的百分比字符 4.绘制一个与之前实心圆相同颜色的空心圆 5.逐渐改变当前的百分比 6.根据百分比

  • 本文向大家介绍Android带进度的圆形进度条,包括了Android带进度的圆形进度条的使用技巧和注意事项,需要的朋友参考一下 我们还是用一个小例子来看看自定义View和自定义属性的使用,带大家来自己定义一个带进度的圆形进度条,我们还是先看一下效果吧 从上面可以看出,我们可以自定义圆环的颜色,圆环进度的颜色,是否显示进度的百分比,进度百分比的颜色,以及进度是实心还是空心等等,这样子是不是很多元化很

  • 本文向大家介绍Android实现带数字的圆形进度条(自定义进度条),包括了Android实现带数字的圆形进度条(自定义进度条)的使用技巧和注意事项,需要的朋友参考一下 开发 设计搞了一个带圆形进度的进度条,在GitHub上逛了一圈,发现没有,自己撸吧。 先看界面效果: 主要思路是写一个继承ProgressBar的自定义View,不废话,直接上代码: 使用 在布局文件中加入: progress_re

  • 今天要学的是一个特定场合要用到的控件——进度条控件。进度条的作用不言而喻,而在实际使用中,通常会有两种类型的进度条:横向进度条和圆形进度条。当然,ProgressBar 也是支持这两种类型的,可以应对大多数的开发场景。 1. ProgressBar 的特性 ProgressBar 是一个图形类型的控件,用来展示当前进度,可以是下载、跳转、切换、保存等等任何可能比较耗时的任务,它在很多场景下对用户体

  • 本文向大家介绍Android 实现自定义圆形进度条的功能,包括了Android 实现自定义圆形进度条的功能的使用技巧和注意事项,需要的朋友参考一下 Android 实现自定义圆形进度条:                 Android 自定义view,在大多数项目中根据客户需求及用户的体验度来说,都要重新写控件的来展示漂亮的界面,这里就对圆形进度条说下如何实现。 绘制自定义的圆形进度条,分为三个步

  • 本文向大家介绍Android自定义控件实现圆形进度条,包括了Android自定义控件实现圆形进度条的使用技巧和注意事项,需要的朋友参考一下 项目中常用到的圆形进度条有好多个,从网上搜到的自定义进度条多是封装的比较好的代码,但是不利于初学者,现在本博客就教给大家如何一步步实现自定义进度条的效果: 先看效果如图… 代码实现过程–main布局 这个布局中就是一个简单的引用 自定义ProgressView