欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-05 21:01:28
本文实例讲述了android编程实现类似于圆形progressbar的进度条效果。分享给大家供大家参考,具体如下: 我们要实现一个类似于小米分享中的圆形播放进度条,a...

本文实例讲述了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程序设计有所帮助。