关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android自定义圆形进度条实现代码

    Android自定义圆形进度条实现代码

    2016-01-19 00:00:00 出处:LeoLiang
    分享

    今天无意中发现一个圆形进度,想想自己实现一个,如下图:

    android自定义圆形进度+自定义属性

    基本思路是这样的:

    1.首先绘制一个实心圆

    2.绘制一个白色实心的正方形,遮住实心圆

    3.在圆的中心动态绘制当前进度的百分比字符

    4.绘制一个与之前实心圆相同颜色的空心圆

    5.逐渐改变当前的百分比

    6.根据百分比,逐渐改变正方形的大小,逐渐减小正方形的底部y轴的坐标,不断重绘,直到达到100%

    首先看看自定义的属性

    在values目录下新建attrs.xml内容如下:

    定义绘制圆形的背景色,和绘制圆形的半径大小

    < xml version="1.0" encoding="utf-8" >
    <resources>
    
        <attr name="circlecolor" format="color"></attr>
        <attr name="half" format="dimension"></attr>
    
        <declare-styleable name="myCircleImage">
            <attr name="circlecolor"></attr>
            <attr name="half"></attr>
        </declare-styleable>
    
    </resources>

    自定义视图

    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.text.TextPaint;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    
    public class CirclePro extends View {
    
    	private Paint paint;
    	private int circleBack;//圆的背景色
    	private int mschedual = 0;//用于控制动态变化
    	float circleHalf; //圆的半径
    	String percent = "";//绘制百分比的字符串
    
    	@SuppressLint("Recycle")
    	public CirclePro(Context context, AttributeSet attrs, int defStyleAttr) {
    		super(context, attrs, defStyleAttr);
    		paint = new Paint();
    		TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.myCircleImage, defStyleAttr,0);
    		@SuppressWarnings("unused")
    		int leng = array.length();
    		//获取自定义的属性,这里注意是R.styleable.myCircleImage_circlecolor而不是R.attr.circlecolor
    		circleBack = array.getColor(R.styleable.myCircleImage_circlecolor,Color.GREEN);
    		circleHalf = array.getDimension(R.styleable.myCircleImage_half,200.f);
    		System.out.println(circleBack);
    
    	}
    
    	/**
    	 * 这个构造参数,当在布局文件中引用该view的时候,必须重写该构造函数
    	 * @param context
    	 * @param attrs
    	 */
    	public CirclePro(Context context, AttributeSet attrs) {
    		this(context, attrs, 0);//调用自己的构造函数
    
    	}
    
    	/**
    	 * 根据文本的
    	 * @param text
    	 * @param textSize
    	 * @return
    	 */
    	public float getTextWidth(String text,float textSize) {
    
    		TextPaint textPaint = new TextPaint();
    		textPaint.setTextSize(textSize);
    		return textPaint.measureText(text);
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		// TODO Auto-generated method stub
    		super.onDraw(canvas);
    
    		float height = getHeight();
    		float width = getWidth();
    //		float circleHalf = (float) (width*0.7/2);
    
    		paint.setColor(circleBack);
    		paint.setAntiAlias(true);
    		paint.setStyle(Paint.Style.FILL);
    		canvas.drawCircle(width/2,height/2,circleHalf, paint);//画实心圆
    
    		if (mschedual <= 100) {//,假如当前进度小于100,画实心矩形
    			paint.setColor(Color.WHITE);
    			canvas.drawRect(width/2-circleHalf,height/2-circleHalf,width/2+circleHalf,height/2+circleHalf - mschedual*circleHalf/50, paint);
    		}
    
    		//画当前进度的字符串
    		paint.setColor(Color.BLACK);
    		paint.setTextSize(30.f);
    		percent = mschedual+" %";
    		canvas.drawText(percent, width/2-getTextWidth(percent,30)/2,height/2+paint.getTextSize()*3/8, paint);//字体的高度=paint.getTextSize()*3/4
    
    		//画空心圆
    		paint.setColor(circleBack);
    		paint.setStyle(Paint.Style.STROKE);
    		canvas.drawCircle(width/2,height/2,circleHalf, paint);
    
    		if (mschedual < 100) {//更改当前进度值,并重绘
    			mschedual++;
    			invalidate();
    		}
    	}
    }

    在activity_main.xml中,需要用到自定义的属性,首先添加命名空间:?xmlns:liu=”http://schemas.android.com/apk/res/com.example.androidcirclepro”

    其中liu是自定义的一个前缀,随意命名的,com.example.androidcirclepro是我们的应用的包名

    activity_main.xmln内容如下:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:liu="http://schemas.android.com/apk/res/com.example.androidcirclepro"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
    
        <com.example.androidcirclepro.CirclePro
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            liu:half="90dp"
            liu:circlecolor="#fff0f0"
            />
    
    </RelativeLayout>

    至此一个自定义的圆形进度条就完成了,是不是很简单。源码下载

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。