继续练习自定义View,这次带来的圆形进度条控件与之前的圆形百分比控件大同小异,这次涉及到了渐变渲染以及画布旋转等知识点,效果如下:
虽然步骤类似,但是我还是要写,毕竟基础的东西就是要多练
1、在res/values文件夹下新建attrs.xml文件,编写自定义属性:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CircleProgressView"> <!-- 弧线宽度 --> <attr name="arcWidth" format="dimension" /> <!-- 刻度个数 --> <attr name="scaleCount" format="integer" /> <!-- 渐变起始颜色 --> <attr name="startColor" format="color" /> <!-- 渐变终止颜色 --> <attr name="endColor" format="color" /> <!-- 标签说明文本 --> <attr name="labelText" format="string" /> <!-- 文本颜色 --> <attr name="textColor" format="color" /> <!-- 百分比文本字体大小 --> <attr name="progressTextSize" format="dimension" /> <!-- 标签说明字体大小 --> <attr name="labelTextSize" format="dimension" /> </declare-styleable> </resources>
2、新建CircleProgressView继承View,重写构造方法:
public CircleProgressView(Context context) {
this(context, null);
}
public CircleProgressView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
3、在第三个构造方法中获取自定义属性的值:
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressView, defStyleAttr, 0);
mArcWidth = ta.getDimension(R.styleable.CircleProgressView_arcWidth, DensityUtils.dp2px(context, 8));
mScaleCount = ta.getInteger(R.styleable.CircleProgressView_scaleCount, 24);
mStartColor = ta.getColor(R.styleable.CircleProgressView_startColor, Color.parseColor("#3FC199"));
mEndColor = ta.getColor(R.styleable.CircleProgressView_endColor, Color.parseColor("#3294C1"));
mColorArray = new int[]{mStartColor, mEndColor};
mLabelText = ta.getString(R.styleable.CircleProgressView_labelText);
mTextColor = ta.getColor(R.styleable.CircleProgressView_textColor, Color.parseColor("#4F5F6F"));
mProgressTextSize = ta.getDimension(R.styleable.CircleProgressView_progressTextSize, 160);
mLabelTextSize = ta.getDimension(R.styleable.CircleProgressView_labelTextSize, 64);
ta.recycle();
4、创建画图所使用的对象,如Paint、Rect、RectF:
mArcBackPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mArcBackPaint.setStyle(Paint.Style.STROKE); mArcBackPaint.setStrokeWidth(mArcWidth); mArcBackPaint.setColor(Color.LTGRAY); mArcForePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mArcForePaint.setStyle(Paint.Style.STROKE); mArcForePaint.setStrokeWidth(mArcWidth); mArcRectF = new RectF(); mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mLinePaint.setStyle(Paint.Style.STROKE); mLinePaint.setColor(Color.WHITE); mLinePaint.setStrokeWidth(DensityUtils.dp2px(context, 2)); mProgressTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mProgressTextPaint.setStyle(Paint.Style.FILL); mProgressTextPaint.setColor(mTextColor); mProgressTextPaint.setTextSize(mProgressTextSize); mLabelTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mLabelTextPaint.setStyle(Paint.Style.FILL); mLabelTextPaint.setColor(mTextColor); mLabelTextPaint.setTextSize(mLabelTextSize); mTextRect = new Rect();
5、重写onMeasure()方法,计算自定义View的宽高:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measuredDimension(widthMeasureSpec), measuredDimension(heightMeasureSpec));
}
private int measuredDimension(int measureSpec) {
int result;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = 800;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
6、重写onDraw()方法,绘制圆弧、刻度线和百分比文本、标签说明文本,注意坐标的计算:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mArcRectF.set(mArcWidth / 2, mArcWidth / 2, getWidth() - mArcWidth / 2, getHeight() - mArcWidth / 2);
//画背景弧线
canvas.drawArc(mArcRectF, -90, 360, false, mArcBackPaint);
//设置渐变渲染
LinearGradient linearGradient = new LinearGradient(getWidth() / 2, 0, getWidth() / 2, getHeight(), mColorArray, null, Shader.TileMode.CLAMP);
mArcForePaint.setShader(linearGradient);
//画百分比值弧线
canvas.drawArc(mArcRectF, -90, mSweepAngle, false, mArcForePaint);
//画刻度线
for (int i = 0; i < mScaleCount; i++) {
canvas.drawLine(getWidth() / 2, 0, getWidth() / 2, mArcWidth, mLinePaint);
//旋转画布
canvas.rotate(360 / mScaleCount, getWidth() / 2, getHeight() / 2);
}
//画百分比文本
String progressText = mProgress + "%";
mProgressTextPaint.getTextBounds(progressText, 0, progressText.length(), mTextRect);
float progressTextWidth = mTextRect.width();
float progressTextHeight = mTextRect.height();
canvas.drawText(progressText, getWidth() / 2 - progressTextWidth / 2,
getHeight() / 2 + progressTextHeight / 2, mProgressTextPaint);
//画标签说明文本
mLabelTextPaint.getTextBounds(mLabelText, 0, mLabelText.length(), mTextRect);
canvas.drawText(mLabelText, getWidth() / 2 - mTextRect.width() / 2,
getHeight() / 2 - progressTextHeight / 2 - mTextRect.height(), mLabelTextPaint);
}
7、暴露一个动态设置百分比的方法:
public void setProgress(float progress) {
Log.e("--> ", progress + "");
ValueAnimator anim = ValueAnimator.ofFloat(mProgress, progress);
anim.setDuration((long) (Math.abs(mProgress - progress) * 20));
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mProgress = (float) animation.getAnimatedValue();
mSweepAngle = mProgress * 360 / 100;
mProgress = (float) (Math.round(mProgress * 10)) / 10;//四舍五入保留到小数点后两位
invalidate();
}
});
anim.start();
}
8、在activity_main.xml布局文件中使用该View:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cpv="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <com.monkey.circleprogressview.CircleProgressView android:id="@+id/circle_progress_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" cpv:arcWidth="8dp" cpv:endColor="#126b94" cpv:labelText="学习进度" cpv:labelTextSize="20sp" cpv:progressTextSize="55sp" cpv:scaleCount="24" cpv:startColor="#12d699" cpv:textColor="#4F5F6F" /> </RelativeLayout>
9、在MainActivity中设置监听,传入百分比:
final CircleProgressView view = (CircleProgressView) findViewById(R.id.circle_progress_view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
float progress = (float) (Math.random() * 100);
view.setProgress(progress);
}
});
代码下载地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android圆形进度条控件
# Android进度条控件
# Android进度条
# Android自定义View绘制的方法及过程(二)
# Android自定义View实现飘动的叶子效果(三)
# Android自定义View实现叶子飘动旋转效果(四)
# Android自定义View实现多片叶子旋转滑动(五)
# Android自定义View叶子旋转完整版(六)
# Android自定义View简易折线图控件(二)
# Android 自定义View的使用介绍
# Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享
# Android自定义View实现广告信息上下滚动效果
# Android自定义View中Paint、Rect、Canvas介绍(一)
# 自定义
# 重写
# 下载地址
# 两位
# 大同小异
# 要多
# 第三个
# 大家多多
# 要写
# 我还是
# 进度条
# 四舍五入
# CircleProgressView_endColor
# mEndColor
# Color
# parseColor
# mLabelText
# getString
# CircleProgressView_labelText
# mColorArray
相关文章:
如何快速搭建虚拟主机网站?新手必看指南
微信h5制作网站有哪些,免费微信H5页面制作工具?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何高效生成建站之星成品网站源码?
如何快速搭建个人网站并优化SEO?
建站主机选购指南:核心配置优化与品牌推荐方案
如何在万网ECS上快速搭建专属网站?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何选择香港主机高效搭建外贸独立站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何选择网络建站服务器?高效建站必看指南
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
再谈Python中的字符串与字符编码(推荐)
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
如何通过西部建站助手安装IIS服务器?
如何解决VPS建站LNMP环境配置常见问题?
网站制作报价单模板图片,小松挖机官方网站报价?
建站主机选哪家性价比最高?
建站之星价格显示格式升级,你的预算足够吗?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
上海网站制作开发公司,上海买房比较好的网站有哪些?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
建站之星如何优化SEO以实现高效排名?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
广东企业建站网站优化与SEO营销核心策略指南
如何快速搭建高效可靠的建站解决方案?
香港服务器部署网站为何提示未备案?
开心动漫网站制作软件下载,十分开心动画为何停播?
建站之星安装步骤有哪些常见问题?
javascript基本数据类型及类型检测常用方法小结
建站之星会员如何解锁更多建站功能?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
网站制作公司,橙子建站是合法的吗?
高端建站三要素:定制模板、企业官网与响应式设计优化
如何选择CMS系统实现快速建站与SEO优化?
,网站推广常用方法?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
深入理解Android中的xmlns:tools属性
制作表格网站有哪些,线上表格怎么弄?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
如何用免费手机建站系统零基础打造专业网站?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
小型网站建站如何选择虚拟主机?
建站之星安装失败:服务器环境不兼容?
如何有效防御Web建站篡改攻击?
网站图片在线制作软件,怎么在图片上做链接?
如何高效配置香港服务器实现快速建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。