电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Android自定義View實現(xiàn)圓形進(jìn)度條

瀏覽:90日期:2022-09-22 08:38:10

本文實例為大家分享了Android自定義View實現(xiàn)圓形進(jìn)度條的具體代碼,供大家參考,具體內(nèi)容如下

效果如下:

Android自定義View實現(xiàn)圓形進(jìn)度條

主要代碼

CircularProgressView.java

public class CircularProgressView extends View { private Paint mBackPaint, mProgPaint; // 繪制畫筆 private RectF mRectF; // 繪制區(qū)域 private int[] mColorArray; // 圓環(huán)漸變色 private int mProgress; // 圓環(huán)進(jìn)度(0-100) /** * 繪制弧線的畫筆 */ private Paint progressPaint; /** * 圓弧圓心位置 */ private int centerX, centerY; /** * 圓弧的半徑 */ private int circleRadius; public CircularProgressView(Context context) { this(context, null); } public CircularProgressView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public CircularProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @SuppressLint('Recycle') TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressView); // 初始化背景圓環(huán)畫筆 mBackPaint = new Paint(); mBackPaint.setStyle(Paint.Style.STROKE); // 只描邊,不填充 mBackPaint.setStrokeCap(Paint.Cap.ROUND); // 設(shè)置圓角 mBackPaint.setAntiAlias(true); // 設(shè)置抗鋸齒 mBackPaint.setDither(true); // 設(shè)置抖動 mBackPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_backWidth, 5)); mBackPaint.setColor(typedArray.getColor(R.styleable.CircularProgressView_progbgColor, Color.LTGRAY)); // 初始化進(jìn)度圓環(huán)畫筆 mProgPaint = new Paint(); mProgPaint.setStyle(Paint.Style.STROKE); // 只描邊,不填充 mProgPaint.setStrokeCap(Paint.Cap.ROUND); // 設(shè)置圓角 mProgPaint.setAntiAlias(true); // 設(shè)置抗鋸齒 mProgPaint.setDither(true); // 設(shè)置抖動 mProgPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_progWidth, 10)); mProgPaint.setColor(typedArray.getColor(R.styleable.CircularProgressView_progColor, Color.BLUE)); //初始化結(jié)束位置小圓點 progressPaint = new Paint(); progressPaint.setStyle(Paint.Style.FILL); // 填充 progressPaint.setStrokeCap(Paint.Cap.ROUND); // 設(shè)置圓角 progressPaint.setAntiAlias(true); // 設(shè)置抗鋸齒 progressPaint.setDither(true); // 設(shè)置抖動 progressPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_progWidth, 10)); progressPaint.setColor(Color.WHITE); // 初始化進(jìn)度圓環(huán)漸變色 int startColor = typedArray.getColor(R.styleable.CircularProgressView_progStartColor, -1); int firstColor = typedArray.getColor(R.styleable.CircularProgressView_progFirstColor, -1); if (startColor != -1 && firstColor != -1) mColorArray = new int[]{startColor, firstColor}; else mColorArray = null; // 初始化進(jìn)度 mProgress = typedArray.getInteger(R.styleable.CircularProgressView_progress, 0); typedArray.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int viewWide = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); int viewHigh = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); int mRectLength = (int) ((viewWide > viewHigh ? viewHigh : viewWide) - (mBackPaint.getStrokeWidth() > mProgPaint.getStrokeWidth() ? mBackPaint.getStrokeWidth() : mProgPaint.getStrokeWidth())); int mRectL = getPaddingLeft() + (viewWide - mRectLength) / 2; int mRectT = getPaddingTop() + (viewHigh - mRectLength) / 2; mRectF = new RectF(mRectL, mRectT, mRectL + mRectLength, mRectT + mRectLength); centerX = getMeasuredWidth() / 2; centerY = getMeasuredHeight() / 2; //計算圓弧半徑和圓心點 circleRadius = Math.min(getMeasuredWidth(), getMeasuredHeight()) / 2; circleRadius-=8; // 設(shè)置進(jìn)度圓環(huán)漸變色 if (mColorArray != null && mColorArray.length > 1) mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawArc(mRectF, 0, 360, false, mBackPaint); canvas.drawArc(mRectF, 270, 360 * mProgress / 100, false, mProgPaint); //繪制結(jié)束位置小圓形 progressPaint.setStrokeWidth(10); progressPaint.setStyle(Paint.Style.FILL); float swipe = 360 * mProgress / 100; Log.d('=================', swipe + ' mProgress'); float radians = (float) (((swipe - 90) / 2) / 180 * 2 * Math.PI); float endX; float endY; endX = centerX + circleRadius * (float) Math.cos(radians); endY = centerY + circleRadius * (float) Math.sin(radians); if (mProgress!=0) { canvas.drawCircle(endX, endY, 8, progressPaint); } } /** * 獲取當(dāng)前進(jìn)度 * * @return 當(dāng)前進(jìn)度(0-100) */ public int getProgress() { return mProgress; } /** * 設(shè)置當(dāng)前進(jìn)度 * * @param progress 當(dāng)前進(jìn)度(0-100) */ public void setProgress(int progress) { this.mProgress = progress; invalidate(); } /** * 設(shè)置當(dāng)前進(jìn)度,并展示進(jìn)度動畫。如果動畫時間小于等于0,則不展示動畫 * * @param progress 當(dāng)前進(jìn)度(0-100) * @param animTime 動畫時間(毫秒) */ public void setProgress(int progress, long animTime) { if (animTime <= 0) setProgress(progress); else { ValueAnimator animator = ValueAnimator.ofInt(mProgress, progress); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) { mProgress = (int) animation.getAnimatedValue(); invalidate();} }); animator.setInterpolator(new OvershootInterpolator()); animator.setDuration(animTime); animator.start(); } } /** * 設(shè)置背景圓環(huán)寬度 * * @param width 背景圓環(huán)寬度 */ public void setBackWidth(int width) { mBackPaint.setStrokeWidth(width); invalidate(); } /** * 設(shè)置背景圓環(huán)顏色 * * @param color 背景圓環(huán)顏色 */ public void setBackColor(/*@ColorRes int color*/String color) { mBackPaint.setColor(Color.parseColor(color)); //畫筆顏色 invalidate(); } /** * 設(shè)置進(jìn)度圓環(huán)寬度 * * @param width 進(jìn)度圓環(huán)寬度 */ public void setProgWidth(int width) { mProgPaint.setStrokeWidth(width); invalidate(); } /** * 設(shè)置進(jìn)度圓環(huán)顏色 * * @param color 景圓環(huán)顏色 */ public void setProgColor(/*@ColorRes int color*/String color) { mProgPaint.setColor(Color.parseColor(color)); //畫筆顏色 mProgPaint.setShader(null); invalidate(); } /** * 設(shè)置進(jìn)度圓環(huán)顏色(支持漸變色) * * @param startColor 進(jìn)度圓環(huán)開始顏色 * @param firstColor 進(jìn)度圓環(huán)結(jié)束顏色 */ public void setProgColor(@ColorRes int startColor, @ColorRes int firstColor) { mColorArray = new int[]{ContextCompat.getColor(getContext(), startColor), ContextCompat.getColor(getContext(), firstColor)}; mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR)); invalidate(); } /** * 設(shè)置進(jìn)度圓環(huán)顏色(支持漸變色) * * @param colorArray 漸變色集合 */ public void setProgColor(@ColorRes int[] colorArray) { if (colorArray == null || colorArray.length < 2) return; mColorArray = new int[colorArray.length]; for (int index = 0; index < colorArray.length; index++) mColorArray[index] = ContextCompat.getColor(getContext(), colorArray[index]); mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR)); invalidate(); }}

attrs.xml

<declare-styleable name='CircularProgressView'> <attr name='backWidth' format='dimension' /> <!--背景圓環(huán)寬度--> <attr name='progWidth' format='dimension' /> <!--進(jìn)度圓環(huán)寬度--> <attr name='progbgColor' format='color' /> <!--背景圓環(huán)顏色--> <attr name='progColor' format='color' /> <!--進(jìn)度圓環(huán)顏色--> <attr name='progStartColor' format='color' /> <!--進(jìn)度圓環(huán)開始顏色--> <attr name='progFirstColor' format='color' /> <!--進(jìn)度圓環(huán)結(jié)束顏色--> <attr name='progress' format='integer' /> <!--圓環(huán)進(jìn)度--> </declare-styleable>

使用方法

<com.view.CircularProgressView android:layout_width='170dp' android:layout_height='170dp' android:layout_centerInParent='true' android:layout_centerHorizontal='true' app:backWidth='5dp' app:progWidth='5dp' app:progbgColor='#4C5098' app:progress='50' android:layout_marginTop='500dp' />

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 奥运星-汽车性能网评-提供个性化汽车资讯 | 天津次氯酸钠酸钙溶液-天津氢氧化钠厂家-天津市辅仁化工有限公司 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 模型公司_模型制作_沙盘模型报价-中国模型网| 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 咖啡加盟,咖啡店加盟连锁品牌-卡小逗 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 美国HASKEL增压泵-伊莱科elettrotec流量开关-上海方未机械设备有限公司 | 外贸网站建设-外贸网站设计制作开发公司-外贸独立站建设【企术】 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 路斯特伺服驱动器维修,伦茨伺服驱动器维修|万骏自动化百科 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 桌上式超净工作台-水平送风超净工作台-上海康路仪器设备有限公司 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 电缆桥架生产厂家_槽式/梯式_热镀锌线槽_广东东莞雷正电气 | 课件导航网_ppt课件_课件模板_课件下载_最新课件资源分享发布平台 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 自清洗过滤器-全自动自清洗过反冲洗过滤器 - 中乂(北京)科技有限公司 |