时间:2021-05-20
在安全卫生上,经常看到有圆形的进度条在转动,效果非常好看,于是就尝试去实现一下,具体实现过程不多说了,直接上效果图,先炫耀下。
效果图:
分析:比较常见于扫描结果、进度条等场景
利用canvas.drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)绘制圆弧
Paint的一些属性定义粗细、颜色、样式等
LinearGradient实现颜色的线型渐变
同样的道理,可以画出长条进度条,扇图饼图等,感兴趣可以试下..
package com.liujing.progressviewdemo;/*** * 自定义圆弧进度条 * * @author liujing */public class ProgressView extends View { //分段颜色 private static final int[] SECTION_COLORS = { Color.GREEN, Color.YELLOW, Color.RED }; private static final String[] ALARM_LEVEL = { "安全", "低危", "中危", "高危" }; private float maxCount; private float currentCount; private int score; private String crrentLevel; private Paint mPaint; private Paint mTextPaint; private int mWidth, mHeight; public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } public ProgressView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ProgressView(Context context) { this(context, null); } private void init(Context context) { mPaint = new Paint(); mTextPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); initPaint(); RectF rectBlackBg = new RectF(20, 20, mWidth - 20, mHeight - 20); canvas.drawArc(rectBlackBg, 0, 360, false, mPaint); mPaint.setColor(Color.BLACK); canvas.drawText(score + "分", mWidth / 2, mHeight / 2, mTextPaint); mTextPaint.setTextSize(40); if (crrentLevel != null) { canvas.drawText(crrentLevel, mWidth / 2, mHeight / 2 + 50, mTextPaint); } float section = currentCount / maxCount; if (section <= 1.0f / 3.0f) { if (section != 0.0f) { mPaint.setColor(SECTION_COLORS[0]); } else { mPaint.setColor(Color.TRANSPARENT); } } else { int count = (section <= 1.0f / 3.0f * 2) ? 2 : 3; int[] colors = new int[count]; System.arraycopy(SECTION_COLORS, 0, colors, 0, count); float[] positions = new float[count]; if (count == 2) { positions[0] = 0.0f; positions[1] = 1.0f - positions[0]; } else { positions[0] = 0.0f; positions[1] = (maxCount / 3) / currentCount; positions[2] = 1.0f - positions[0] * 2; } positions[positions.length - 1] = 1.0f; LinearGradient shader = new LinearGradient(3, 3, (mWidth - 3) * section, mHeight - 3, colors, null, Shader.TileMode.MIRROR); mPaint.setShader(shader); } canvas.drawArc(rectBlackBg, 180, section * 360, false, mPaint); } private void initPaint() { mPaint.setAntiAlias(true); mPaint.setStrokeWidth((float) 40.0); mPaint.setStyle(Style.STROKE); mPaint.setStrokeCap(Cap.ROUND); mPaint.setColor(Color.TRANSPARENT); mTextPaint.setAntiAlias(true); mTextPaint.setStrokeWidth((float) 3.0); mTextPaint.setTextAlign(Paint.Align.CENTER); mTextPaint.setTextSize(50); mTextPaint.setColor(Color.BLACK); } private int dipToPx(int dip) { float scale = getContext().getResources().getDisplayMetrics().density; return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1)); } public int getScore() { return score; } public String getCrrentLevel() { return crrentLevel; } public void setCrrentLevel(String crrentLevel) { this.crrentLevel = crrentLevel; } public float getMaxCount() { return maxCount; } public float getCurrentCount() { return currentCount; } public void setScore(int score) { this.score = score; if (score == 100) { this.crrentLevel = ALARM_LEVEL[0]; } else if (score >= 70 && score < 100) { this.crrentLevel = ALARM_LEVEL[1]; } else if (score >= 30 && score < 70) { this.crrentLevel = ALARM_LEVEL[2]; } else { this.crrentLevel = ALARM_LEVEL[3]; } invalidate(); } /*** * 设置最大的进度值 * * @param maxCount */ public void setMaxCount(float maxCount) { this.maxCount = maxCount; } /*** * 设置当前的进度值 * * @param currentCount */ public void setCurrentCount(float currentCount) { this.currentCount = currentCount > maxCount ? maxCount : currentCount; invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); if (widthSpecMode == MeasureSpec.EXACTLY || widthSpecMode == MeasureSpec.AT_MOST) { mWidth = widthSpecSize; } else { mWidth = 0; } if (heightSpecMode == MeasureSpec.AT_MOST || heightSpecMode == MeasureSpec.UNSPECIFIED) { mHeight = dipToPx(15); } else { mHeight = heightSpecSize; } setMeasuredDimension(mWidth, mHeight); }}Demo:http://xiazai.jb51.net/201507/yuanma/ProgressViewDemo(jb51.net).rar
以上内容就是实现android自定义进度条渐变圆形的代码,希望对大家有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Android自定义圆形进度条,分享给大家供大家参考。具体如下:大家也可以参考这两篇文章进行学习:《自定义Android圆形进度条(附源码)》《A
进度条样式在项目中经常可以见到,下面小编给大家分享Android三种方式实现ProgressBar自定义圆形进度条。Android进度条有4种风格可以使用。默认
本文实例讲述了Android编程实现自定义进度条颜色的方法。分享给大家供大家参考,具体如下:android自定义进度条颜色先看图基于产品经理各种自定义需求,经过
Android实现自定义圆形进度条:Android自定义view,在大多数项目中根据客户需求及用户的体验度来说,都要重新写控件的来展示漂亮的界面,这里就对圆形进
本文实例为大家分享了Android自定义带圆点的半圆形进度条,供大家参考,具体内容如下仅限用于半圆形,如须要带圆点的圆形进度条,圆点会出现错位现象,此代码仅供,