Android自定义View-绘制扇形实现圆形进度


Android自定义View-绘制扇形实现圆形进度_第1张图片 Android自定义View-绘制扇形实现圆形进度_第2张图片

先上图,这是要实现的效果,根据音量的大小中间的进度调节。麦克风部分是透明的,所以原理就是在蒙层的底部画白色的扇形。如下图所示
Android自定义View-绘制扇形实现圆形进度_第3张图片
这样就能实现圆形像水瓮一样的进度。
实现方法:
通过Canvas的drawArc方法实现。
public void drawArc (@NonNull RectF oval , float startAngle , float sweepAngle , boolean useCenter ,
        @NonNull Paint paint)
  • oval  指定圆弧的外轮廓矩形区域
  • startAngle 开始的角度
  • sweepAngle 扫过的角度
  • useCenter 是否使用圆心,true为使用,画扇形的时候使用,false不使用,画上图类型的图形时应不使用圆心
  • paint 画笔
关于起始角度:水平的右侧为0度,顺时针增加,0度上方的度数可以写作-30度,也可以是330度
关于扫过角度:如果要画左侧与右侧水平的扇形,若起始角度为x,扫过角度为y,则 y=(90-x)*2
Android自定义View-绘制扇形实现圆形进度_第4张图片
Android自定义View-绘制扇形实现圆形进度_第5张图片
核心代码
@Override
protected void onDraw (Canvas canvas) {
   
super .onDraw(canvas) ;
   
// 创建画笔
   
Paint paint = new Paint() ;
   
paint.setColor(Color. BLUE ) ;
   
paint.setStrokeJoin(Paint.Join. ROUND ) ;
   
paint.setStrokeCap(Paint.Cap. ROUND ) ;
   
paint.setStyle(Paint.Style. FILL ) ;
   
   
RectF rect = new RectF( 0 , 0 , getMeasuredWidth() , getMeasuredHeight()) ;
    int
a = - 45 ;
   
canvas.drawArc(rect , // 弧线所使用的矩形区域大小
           
a // 开始角度
           
( 90 - a) * 2 , // 扫过的角度
           
false, // 是否使用中心
           
paint) ;

}

根据传值设置进度
设进度总和为100,当前进度为current,该图形起始的角度为90度,最大的角度为-90度,所以角度总和为180度,设当前current对应的起始角度为y,current为x
则起始角度 y=90-(x/100)*180
代码如下
@Override
protected void onDraw (Canvas canvas) {
   
super .onDraw(canvas) ;
   
// 创建画笔
   
if (mPaint == null )
       
mPaint =
new Paint() ;
   
mPaint .setColor(Color. WHITE ) ;

    if
( mProgress > MAX_VOLUME ) {
       
mProgress = MAX_VOLUME ;
   
}
   
// 得到当前音量占最大音量的百分比
   
double percent = (( double ) mProgress ) / MAX_VOLUME ;
   
// 得到当前音量画扇形时从起始角度应该转过的角度
   
double degree = volume_sum_degree * percent ;
   
// 画扇形时的起始角度
   
double drawStartDegree = volume_down_degree - degree ;
   
RectF rect = new RectF( 0 , 0 , getMeasuredWidth() , getMeasuredHeight()) ;
   
canvas.drawArc(rect , // 弧线所使用的矩形区域大小
           
( float ) drawStartDegree // 开始角度
           
( float ) (( 90 - drawStartDegree) * 2 ) , // 扫过的角度
           
false, // 是否使用中心
           
mPaint ) ;
}

你可能感兴趣的:(Android)