Android 自定义漂亮的圆形进度条

简介:
这几天对Android中实现画圆弧及圆弧效果中所实现的效果进行了修改,改为进度圆心进度条,效果如图所示




 




TasksCompletedView.java 代码如下

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.view.View;

import com.snailws.taskscompleted.R;

/**
* @author naiyu(http://snailws.com)
* @version 1.0
*/
public class TasksCompletedView extends View {

        // 画实心圆的画笔
        private Paint mCirclePaint;
        // 画圆环的画笔
        private Paint mRingPaint;
        // 画字体的画笔
        private Paint mTextPaint;
        // 圆形颜色
        private int mCircleColor;
        // 圆环颜色
        private int mRingColor;
        // 半径
        private float mRadius;
        // 圆环半径
        private float mRingRadius;
        // 圆环宽度
        private float mStrokeWidth;
        // 圆心x坐标
        private int mXCenter;
        // 圆心y坐标
        private int mYCenter;
        // 字的长度
        private float mTxtWidth;
        // 字的高度
        private float mTxtHeight;
        // 总进度
        private int mTotalProgress = 100;
        // 当前进度
        private int mProgress;

        public TasksCompletedView(Context context, AttributeSet attrs) {
                super(context, attrs);
                // 获取自定义的属性
                initAttrs(context, attrs);
                initVariable();
        }

        private void initAttrs(Context context, AttributeSet attrs) {
                TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,
                                R.styleable.TasksCompletedView, 0, 0);
                mRadius = typeArray.getDimension(R.styleable.TasksCompletedView_radius, 80);
                mStrokeWidth = typeArray.getDimension(R.styleable.TasksCompletedView_strokeWidth, 10);
                mCircleColor = typeArray.getColor(R.styleable.TasksCompletedView_circleColor, 0xFFFFFFFF);
                mRingColor = typeArray.getColor(R.styleable.TasksCompletedView_ringColor, 0xFFFFFFFF);
                
                mRingRadius = mRadius + mStrokeWidth / 2;
        }

        private void initVariable() {
                mCirclePaint = new Paint();
                mCirclePaint.setAntiAlias(true);
                mCirclePaint.setColor(mCircleColor);
                mCirclePaint.setStyle(Paint.Style.FILL);
                
                mRingPaint = new Paint();
                mRingPaint.setAntiAlias(true);
                mRingPaint.setColor(mRingColor);
                mRingPaint.setStyle(Paint.Style.STROKE);
                mRingPaint.setStrokeWidth(mStrokeWidth);
                
                mTextPaint = new Paint();
                mTextPaint.setAntiAlias(true);
                mTextPaint.setStyle(Paint.Style.FILL);
                mTextPaint.setARGB(255, 255, 255, 255);
                mTextPaint.setTextSize(mRadius / 2);
                
                FontMetrics fm = mTextPaint.getFontMetrics();
                mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);
                
        }

        @Override
        protected void onDraw(Canvas canvas) {

                mXCenter = getWidth() / 2;
                mYCenter = getHeight() / 2;
                
                canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);
                
                if (mProgress > 0 ) {
                        RectF oval = new RectF();
                        oval.left = (mXCenter - mRingRadius);
                        oval.top = (mYCenter - mRingRadius);
                        oval.right = mRingRadius * 2 + (mXCenter - mRingRadius);
                        oval.bottom = mRingRadius * 2 + (mYCenter - mRingRadius);
                        canvas.drawArc(oval, -90, ((float)mProgress / mTotalProgress) * 360, false, mRingPaint); //
//                        canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint);
                        String txt = mProgress + "%";
                        mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());
                        canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);
                }
        }
        
        public void setProgress(int progress) {
                mProgress = progress;
//                invalidate();
                postInvalidate();
        }

}

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    
    <declare-styleable name="TasksCompletedView">
        <attr name="radius" format="dimension"/>
        <attr name="strokeWidth" format="dimension"/>
        <attr name="circleColor" format="color"/>
        <attr name="ringColor" format="color"/>
    </declare-styleable>
    
</resources>

源码下载:http://download.csdn.net/detail/nainai007/6554501
相关文章
|
4天前
|
Android开发 异构计算 前端开发
Android显示原理,安卓自定义view面试
Android显示原理,安卓自定义view面试
|
4天前
|
Android开发 开发者 容器
Android自定义View:MeasureSpec的真正意义与View大小控制
Android自定义View:MeasureSpec的真正意义与View大小控制
|
5天前
|
Java Android开发
Android 12 自定义底部导航栏
Android 12 自定义底部导航栏
22 4
|
6天前
|
存储 消息中间件 缓存
Android应用开发:实现自定义View的高效绘制
【5月更文挑战第12天】 在Android开发中,创建高性能的自定义视图是一项挑战,它要求开发者深入理解Android的绘图机制以及UI渲染过程。本文将探讨如何优化自定义View的绘制流程,减少不必要的重绘和布局计算,以提升应用的响应速度和流畅度。我们将介绍几种关键策略,包括利用硬件加速、缓存绘制内容和使用高效的数据结构来存储视图状态。通过实例分析和性能对比,读者将学会如何在自己的应用中运用这些技巧,从而打造出更加流畅和响应迅速的用户界面。
|
6天前
|
XML Android开发 数据格式
Android下自定义Button样式
Android下自定义Button样式
14 3
|
6天前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
|
6天前
|
搜索推荐 Android开发
自定义Android标题栏TitleBar布局
自定义Android标题栏TitleBar布局
11 1
|
4天前
|
设计模式 算法 前端开发
Android面经分享,失业两个月,五一节前拿到Offer,设计思想与代码质量优化+程序性能优化+开发效率优化
Android面经分享,失业两个月,五一节前拿到Offer,设计思想与代码质量优化+程序性能优化+开发效率优化
|
3天前
|
编解码 数据库 Android开发
安卓应用开发:打造高效用户界面的五大技巧
【5月更文挑战第18天】在竞争激烈的应用市场中,一个流畅且直观的用户界面(UI)对于安卓应用的成功至关重要。本文将探讨五种提升安卓应用用户界面性能的技巧,包括合理布局设计、优化资源使用、利用硬件加速、内存管理以及响应式编程。通过这些方法,开发者可以创建出既美观又高效的应用体验,从而吸引和保留用户。
|
4天前
|
XML Android开发 数据格式
ConstraintLayout 2,Android高级开发面试
ConstraintLayout 2,Android高级开发面试