自定义View 进度条

1.在values下面新建一个attrs.xml,现在里面定义我们的自定义属性,

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="RoundProgressBar"><attr name="roundColor" format="color"></attr><attr name="roundProgressColor" format="color"></attr><attr name="roundWidth" format="dimension"></attr><attr name="textColor" format="color"></attr><attr name="textSize" format="dimension"></attr><attr name="max" format="integer"></attr><attr name="textIsDisplayable" format="boolean"></attr><attr name="style"><enum name="STROKE" value="0"></enum><enum name="FILL" value="1"></enum></attr></declare-styleable></resources>

2、创建一个customView 自定义view类  

package com.example.customprogress;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;public class RoundProgressBar extends View
{private Paint mPaint; //画笔private int roundColor; //圆环的颜色private int roundProgressColor; //圆环进度的颜色private int textColor; //百分比字符串的颜色private float textSize; //百分比字体的大小private float roundWidth;//圆环的宽度private int max;//最大进度private int progerss;//当前进度private boolean textIsDisplayable; //是否显示private int style;//进度风格 public static final int STROKE = 0;public static final int FILL = 1;//第一步重写所以构造方法public RoundProgressBar(Context context){super(context,null);// TODO Auto-generated constructor stub
    }public RoundProgressBar(Context context, AttributeSet attrs){super(context, attrs);//创建画笔对象mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);// 第二步   初始化自定义属性
        initAttrs(context,attrs);}public RoundProgressBar(Context context, AttributeSet attrs,int defStyleAttr){super(context, attrs, defStyleAttr);}//第三步  重写onDraw方法
    @Overrideprotected void onDraw(Canvas canvas){        super.onDraw(canvas);//画圆环int center = getWidth()/2; //获取圆形的x坐标int radius =(int)(center-roundWidth/2); //圆环的半径mPaint.setColor(roundColor);//设置圆环的颜色mPaint.setStyle(Paint.Style.STROKE);//空心mPaint.setStrokeWidth(roundWidth);//宽度//画出圆环
        canvas.drawCircle(center, center, radius, mPaint);//画进度百分比mPaint.setStrokeWidth(0);mPaint.setColor(textColor);mPaint.setTextSize(textSize);mPaint.setTypeface(Typeface.DEFAULT_BOLD);//设置字体        //计算中间的进度百分比,先转换成float在进行除法运算,不然都为0  int percent = (int)(((float)progerss/ (float)max) * 100);float textWidth = mPaint.measureText(percent+"%");//获取字体宽度if(textIsDisplayable&&percent!=0&&style==STROKE){//画出中间进度值canvas.drawText(percent+"%",center-textWidth/2, center+textSize/2, mPaint);}//画圆弧
        mPaint.setStrokeWidth(roundWidth);mPaint.setColor(roundProgressColor);//圆弧进度颜色
RectF oval = new RectF(center-radius, center-radius,center+radius, center+radius);switch (style){case STROKE:mPaint.setStyle(Paint.Style.STROKE);canvas.drawArc(oval,0,360*progerss/max, false,mPaint);//根据进度画圆弧break;case FILL://填充的圆
            mPaint.setStyle(Paint.Style.FILL_AND_STROKE);if(progerss!=0){canvas.drawArc(oval, 0, 360*progerss/max,true, mPaint);}break;}}public synchronized int getMax(){return max;}public synchronized void setMax(int max){if(max<0){throw new IllegalArgumentException("max not less than 0");}this.max = max;}public synchronized int getProgress(){return progerss;}public synchronized void setProgress(int progress){if(progress<0){throw new IllegalArgumentException("progress not less than 0");}if(progress>max){this.progerss = max;}if(progress<max){this.progerss = progress;}postInvalidate();//刷新界面调用postInvalidate()能在非UI线程中刷新
    }public int getCricleColor() {  return roundColor;  }  public void setCricleColor(int cricleColor) {  this.roundColor = cricleColor;  }  public int getCricleProgressColor() {  return roundProgressColor;  }  public void setCricleProgressColor(int cricleProgressColor) {  this.roundProgressColor = cricleProgressColor;  }  public int getTextColor() {  return textColor;  }  public void setTextColor(int textColor) {  this.textColor = textColor;  }  public float getTextSize() {  return textSize;  }  public void setTextSize(float textSize) {  this.textSize = textSize;  }  public float getRoundWidth() {  return roundWidth;  }  public void setRoundWidth(float roundWidth) {  this.roundWidth = roundWidth;  }  //初始化自定义属性private void initAttrs(Context context,AttributeSet attrs){//获取TypedArray 对象   得到自定义属性TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.RoundProgressBar);//初始化属性roundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor,Color.RED );roundProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor,Color.GREEN);textColor = typedArray.getColor(R.styleable.RoundProgressBar_textColor,Color.GREEN);textSize = typedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);roundWidth = typedArray.getDimension(R.styleable.RoundProgressBar_roundWidth,5);max = typedArray.getInteger(R.styleable.RoundProgressBar_max,100);textIsDisplayable = typedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable,true);style = typedArray.getInt(R.styleable.RoundProgressBar_style,0);//一定要注意  用完TypedArray 对象 要回收
        typedArray.recycle();}}

3、在布局文件中使用自定义View

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:android_custom="http://schemas.android.com/apk/res/com.example.customprogress"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"tools:context=".MainActivity" >  <com.example.customprogress.RoundProgressBar android:id="@+id/custom_progress"android:layout_width="80dp"android:layout_height="80dp"   android_custom:roundColor="#4f5f6f"android_custom:textColor="#9a32cd"android_custom:roundProgressColor="#f00"android_custom:textIsDisplayable="true"android_custom:roundWidth="10dp"android_custom:textSize="18sp"android_custom:style="STROKE"      /></LinearLayout>

 

转载于:https://www.cnblogs.com/pbq-dream/p/5399961.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python图形绘制库turtle中文开发文档及示例大全【最详细、连结果图都有,gif格式的!】

前言 本文参考&#xff1a;Python库官方文档 本文例子摘抄自Python库官方文档&#xff0c;为了方便讲解&#xff0c;个人进行了修改&#xff0c;并且相关函数说明不完全参照文档&#xff0c;在结果处贴出了执行结果&#xff0c;不方便用jpg等图片作为展示的用了gif格式图片进行…

oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介

作者&#xff1a;甘植恳-AkenPostgreSQL和Oracle、MySQL等RDBMS一样&#xff0c;都有自己的并发控制机制。而并发控制的目的是为了在多个事务同时运行时保持事务ACID属性。MVCC即Multi-version concurrence control首字母缩写&#xff0c;MVCC会为每个数据更改操作创建数据块或…

【Microstation】不能从对话框中装载/创建类型为 ‘HTML‘,id =41510001 的对话框条目,该对话框为: “文本编辑器 - 字处理器“,GCSDIALOG 已装载。

在Win7上安装MicroStation V8i简体中文版,在添加文字图层的时候,点击出现提示“不能从对话框中装载/创建类型为 HTML,id =41510001 的对话框条目,该对话框为: "文本编辑器 - 字处理器",GCSDIALOG 已装载。”,问题出在Win7对该软件的兼容性上。 MS软件提供了三种…

fastdfs 一个group内实现按照不同的项目,指定路径存储.

为什么80%的码农都做不了架构师&#xff1f;>>> 环境介绍: 1: 公司目前有5个项目 A B C D E 日后可能会有所增加. 2: 使用fastdfs存储这5各项目的文件,要求各各项目的文件分开存储,也就是每个项目的文件存储到一个固定的位置. 3: 三台机器ip地址分配如下 tracker…

一个WPF开发的打印对话框-PrintDialogX

今天五月一号&#xff0c;大家玩的开心哦。1. 介绍今天介绍一个WPF开发的打印对话框开源项目-PrintDialogX[1]&#xff0c;该开源项目由《WPF开源项目&#xff1a;AIStudio.Wpf.AClient》[2]作者推荐。欢迎使用 PrintDialogX, 这是一个开源项目。免费用于商业用途。用于 C# 的自…

这一新的可视化方法教你优雅地探索相关性

一个古老的诅咒一直萦绕着数据分析&#xff1a;我们用来改进模型的变量越多&#xff0c;那么我们需要的数据就会出现指数级的增长。不过&#xff0c;我们通过关注重要的变量就可以避免欠拟合以及降低收集大量数据的需求。减少输入变量的一种方法是鉴别其对输出变量的影响。变量…

【新手宝典】一篇博文带萌新建站并了解建站体系流程和对萌新友好的便捷方式,这篇博文很有可能是你的启蒙文

前言 本片博文主要面向于还没接触过web开发的萌新&#xff0c;以及想知道整体流程并且完成建站的萌新&#xff1b;如果你是个大佬&#xff0c;就没必要看下去了。 本篇博文没有难啃的骨头&#xff0c;请各位萌新放心食用。 本篇博文采用通俗易懂的方式讲解&#xff0c;轻松并…

MicroStation V8i简体中文版中文字体乱码解决办法

Bentley (奔特力)是一家软件研发公司,其核心业务是满足负责建造和管理全球基础设施,包括公路、桥梁、机场、摩天大楼、工业厂房和电厂以及公用事业网络等领域专业人士的需求。Bentley 在基础设施资产的整个生命周期内针对不同的职业,包括工程师、建筑师、规划师、承包商、…

惠普ProDesk行业专用台式机U盘不识别解决办法

惠普ProDesk行业专用台式机在使用的过程当中&#xff0c;老出现插入U盘不识别的问题&#xff0c;总是需要在重启的过程中插入U盘才能使用U盘&#xff0c;解决办法是&#xff1a;&#xff08;1&#xff09;打开设备管理器&#xff0c;如下图所示&#xff1a;&#xff08;2&#…

【一】Windows API 零门槛编程指南——MessageBox 基本使用及基础讲解

本篇作为Windows API 系列文章的第一篇&#xff0c;将简要的讲解一下什么是Windows API&#xff0c;Windows API能做些什么&#xff0c;并且尽可能讲解一些新出现的专有名词&#xff1b;本系列博文几乎没有难啃的“专业术语”&#xff0c;尽量让读者能够看明白文章所述内容&…

中国人工智能学会通讯——基于视频的行为识别技术 1.1 什么是行为

今天跟大家分享的主题是基于视频的 行为识别领域研究&#xff0c;主要介绍一下早期 的非深度学习传统方法和近期深度学习 方法取得的结果。深度学习方法带来了 非常大的变革&#xff0c;提升了识别系统的性能&#xff0c; 但这并不意味着我们把传统的东西都要 抛弃&#xff0c;…

Windows 11 22H2 22610 重磅发布!删除水印,多彩任务管理器,文件资源管理器深度优化...

面向 Dev 和 Beta 频道的 Windows 预览体验成员&#xff0c;微软现已发布 Windows 11 22H2 预览版 Build 22610。主要变化1.微软现已更新 Windows 11 任务管理器的进程页面&#xff0c;将随着 Windows 主题颜色而变化。2.微软现已更新锁屏上的电池图标&#xff0c;适配 Windows…

一篇文教你使用python Turtle库画出“精美碎花小清新风格树”快来拿代码!

Turtle库手册可以查询查询 python图形绘制库turtle中文开发文档及示例大全&#xff0c;手册中现有示例&#xff0c;不需要自己动手就可以查看演示。 文章修改记录 修改记录 1&#xff1a;2020年5月17日 12:06:51 由于某些童鞋回复说自己会卡死&#xff0c;请把代码&#xff…

阿里云500服务器内部错误,腾讯云服务器网站不能打开 提示内部错误http 500

满意答案2010qqww2015.11.14采纳率&#xff1a;55% 等级&#xff1a;9已帮助&#xff1a;13114人实服务器内部500错误大概可分为两种&#xff0c;一种是服务器本身权限问题&#xff0c;另一种是程序上不规范或者错误造成。所以要解决此问题需要先弄清楚其到底是哪种原因&…

Hadoop(四)C#操作Hbase

HbaseHbase是一种NoSql模式的数据库&#xff0c;采用了列式存储。而采用了列存储天然具备以下优势&#xff1a;可只查涉及的列&#xff0c;且列可作为索引&#xff0c;相对高效针对某一列的聚合及其方便同一列的数据类型一致&#xff0c;方便压缩同时由于列式存储将不同列分开存…

【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”

本系列博文几乎没有难啃的“专业术语”&#xff0c;尽量让读者能够看明白文章所述内容&#xff0c;是本系列博文的核心宗旨之一。&#xff08;由于本人也是由于项目需要&#xff0c;所以才来查阅相关资料&#xff0c;文中出现的错误欢迎指出&#xff0c;共同进步&#xff01;谢…

一行命令 优化上传速度

本文来自 fir.im 首席吉祥物 TraWor. 最近许多用户反映上传速度慢的一塌糊涂&#xff0c;七牛的上传带宽我想肯定是没问题的&#xff0c;那原因不必多想就剩下 DNS 了。 即便本地网络再快&#xff0c;DNS 服务器给了一个很远的服务器地址也没办法很快的上传。 在终端运行这一行…

go 服务器 源码,LollipopGo开源游戏服务器框架--global服务器源码

大家好&#xff0c;我是彬哥&#xff0c;本节给大家讲下LollipopGov1.0.20190102版本游戏服务器globla服务器&#xff0c;抛砖引玉了&#xff0c;主要是针对Go语言游戏服务器Global服务器处理。package mainimport ("LollipopGo/LollipopGo/conf""LollipopGo/Lo…

ArcGIS导入Sketchup模型

ArcGIS可以与Sketchup、3D Studio Max等三维软件完美进行交互。 ArcGIS可以借助 Import 3D Files 工具支持主流的三维模型导入。支持 3D Studio Max (*.3ds)、VRML and GeoVRML 2.0 (*.wrl)、SketchUp 6.0 (*.skp)、OpenFlight 15.8 (*.flt)、Collaborative Design Activity (C…

剑指offer之两个队列实现栈的问题

1 问题 两个队列实现栈的插入和获取头部元素的功能 2 分析 1&#xff09;获取头部元素的功能分析&#xff1a; 我们有2个队列&#xff0c;我们知道队列的特点的先进先出&#xff0c;而栈的特点是先进后出&#xff0c;比如我们有数据1,2,3,4,我们分别依次压入队列1&#xff0…