安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

AndroidAPP显示自定义圆弧进度条(可点击,可滑动)

7月19日 眸中星投稿
  效果图:
  实现思路:
  1。定义一个画外弧的画笔,使用画笔画出圆弧UI
  2。定义一个画内圆(灰色)的画笔,使用画笔画出内圆UI
  3。定义一个画圆点的画笔,使用画笔画出圆点UI
  4。定义一个画文本的画笔,使用画笔画出文本的值
  5。监听触摸事件,通过触摸事件计算和判断是否在圆弧上。
  实现CustomVolumeProgressView自定义View,如下:importandroid。content。Cimportandroid。graphics。Cimportandroid。graphics。Pimportandroid。graphics。RectF;importandroid。util。AttributeSimportandroid。util。Limportandroid。view。MotionEimportandroid。view。Vimportandroidx。annotation。NonNimportandroidx。annotation。NpublicclassCustomVolumeProgressViewextendsView{进度条所占用的角度privatestaticfinalintARCFULLDEGREE270;绘制进度条画笔privatePaintprogressBarP绘制内心园画笔privatePaintinnerCircleP绘制小圆的画笔privatePaintsmallCircleP绘制文字的画笔privatePainttextP绘制文字大小privateinttextSize60;圆弧进度条圆心位置privateintcenterX,centerY;小圆的半径privateintsmallCircleR小圆的宽度privateintsmallCircleWidth7;圆弧进度条绘制区域privateRectFprogressBarRectF;圆弧进度值(0100)privateintmP圆弧进度最大值privateintmProgressMax100;圆弧进度条的宽度privateintprogressBarWidth8;内心园的宽度privateintinnerCircleWidth6;小圆圆心坐标floatsmallX,smallY;进度条后端的坐标floatprogressX,progressY;进度条半径floatprogressRpublicCustomVolumeProgressView(Contextcontext){super(context);init();}publicCustomVolumeProgressView(Contextcontext,NullableAttributeSetattrs){super(context,attrs);init();}publicCustomVolumeProgressView(Contextcontext,NullableAttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);init();}privatevoidinit(){初始化圆弧进度画笔progressBarPaintnewPaint();progressBarPaint。setStyle(Paint。Style。STROKE);只描边,不填充progressBarPaint。setStrokeCap(Paint。Cap。ROUND);设置圆角progressBarPaint。setAntiAlias(true);设置抗锯齿progressBarPaint。setDither(true);设置抖动progressBarPaint。setStrokeWidth(progressBarWidth);progressBarPaint。setColor(getResources()。getColor(R。color。progress));初始化跟随进度条小圆的画笔smallCirclePaintnewPaint();smallCirclePaint。setStyle(Paint。Style。FILL);填充smallCirclePaint。setStrokeCap(Paint。Cap。ROUND);设置圆角smallCirclePaint。setAntiAlias(true);设置抗锯齿smallCirclePaint。setDither(true);设置抖动smallCirclePaint。setStrokeWidth(smallCircleRadius);smallCirclePaint。setColor(getResources()。getColor(R。color。progress));初始化内心圆画笔innerCirclePaintnewPaint();innerCirclePaint。setStyle(Paint。Style。STROKE);只描边,不填充innerCirclePaint。setStrokeCap(Paint。Cap。ROUND);设置圆角innerCirclePaint。setAntiAlias(true);设置抗锯齿innerCirclePaint。setDither(true);设置抖动innerCirclePaint。setStrokeWidth(innerCircleWidth);innerCirclePaint。setColor(getResources()。getColor(R。color。innerCircle));初始化音量值画笔textPaintnewPaint();textPaint。setAntiAlias(true);textPaint。setColor(getResources()。getColor(R。color。white));textPaint。setFakeBoldText(true);textPaint。setTextSize(textSize);}OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){super。onMeasure(widthMeasureSpec,heightMeasureSpec);获取圆弧进度的区域intviewWidegetMeasuredWidth()getPaddingLeft()getPaddingRight();intviewHighgetMeasuredHeight()getPaddingTop()getPaddingBottom();intmRectLength(int)((viewWideviewHigh?viewHigh:viewWide)progressBarWidth);intmRectLgetPaddingLeft()(viewWidemRectLength)2;intmRectTgetPaddingTop()(viewHighmRectLength)2;progressBarRectFnewRectF(mRectL,mRectT,mRectLmRectLength,mRectTmRectLength);获取圆弧中心坐标centerXgetMeasuredWidth()2;centerYgetMeasuredHeight()2;计算小圆到圆弧进度圆心的半径(距离)smallCircleRadiusMath。min(getMeasuredWidth(),getMeasuredHeight())2;progressRadiussmallCircleRsmallCircleRadius30;适当调整}OverrideprotectedvoidonDraw(Canvascanvas){super。onDraw(canvas);绘制进度条canvas。drawArc(progressBarRectF,90((360ARCFULLDEGREE)1),ARCFULLDEGREEmProgress100,false,progressBarPaint);绘制跟随进度条的小圆floatswipeARCFULLDEGREEmProgressmProgressMfloatradians(float)((90((360ARCFULLDEGREE)1)swipe)180Math。PI);smallXcenterXsmallCircleRadius(float)Math。cos(radians);smallYcenterYsmallCircleRadius(float)Math。sin(radians);progressXcenterXprogressRadius(float)Math。cos(radians);progressYcenterYprogressRadius(float)Math。sin(radians);canvas。drawCircle(smallX,smallY,smallCircleWidth,smallCirclePaint);绘制内心圆canvas。drawCircle(centerX,centerY,smallCircleRadius14,innerCirclePaint);绘制文字floattextWidthtextPaint。measureText(mProgress);inttextHeight(int)(Math。ceil(textPaint。getFontMetrics()。descenttextPaint。getFontMetrics()。ascent)2);canvas。drawText(mProgress,centerXtextWidth2,centerXtextHeight4,textPaint);}privatebooleanisDOverridepublicbooleanonTouchEvent(NonNullMotionEventevent){处理拖动事件floatcurrentXevent。getX();floatcurrentYevent。getY();intactionevent。getAction();switch(action){caseMotionEvent。ACTIONDOWN:判断是否在进度条thumb位置if(checkOnArc(currentX,currentY)){intnewProgress(int)(calDegreeByPosition(currentX,currentY)ARCFULLDEGREEmProgressMax);setProgressSync(newProgress);isD}caseMotionEvent。ACTIONMOVE:if(isDragging){判断拖动时是否移出去了if(checkOnArc(currentX,currentY)){setProgressSync((int)(calDegreeByPosition(currentX,currentY)ARCFULLDEGREEmProgressMax));}else{isD}}caseMotionEvent。ACTIONUP:isD}}判断该点是否在弧线上(附近)privatebooleancheckOnArc(floatcurrentX,floatcurrentY){floatdistancecalDistance(currentX,currentY,centerX,centerY);floatdegreecalDegreeByPosition(currentX,currentY);returndistanceprogressRadiusprogressBarWidth4distanceprogressRadiusprogressBarWidth4(degree30degreeARCFULLDEGREE30);}privatefloatcalDistance(floatx1,floaty1,floatx2,floaty2){return(float)Math。sqrt((x1x2)(x1x2)(y1y2)(y1y2));}根据当前位置,计算出进度条已经转过的角度。privatefloatcalDegreeByPosition(floatcurrentX,floatcurrentY){floata1(float)(Math。atan(1。0f(centerXcurrentX)(currentYcenterY))Math。PI180);if(currentYcenterY){a1180;}elseif(currentYcenterYcurrentXcenterX){a1360;}returna1(360ARCFULLDEGREE)2;}publicvoidsetProgressSync(intprogress){mProgresscheckProgress(progress);volumeProgressInterface。updatVolumeProgress(progress);invalidate();}privateVolumeProgressInterfacevolumeProgressIpublicvoidsetVolumeProgressInterface(VolumeProgressInterfacevolumeProgressInterface){this。volumeProgressInterfacevolumeProgressI}保证progress的值位于〔0,max〕privateintcheckProgress(intprogress){if(progress0){return0;}returnprogressmProgressMax?mProgressMax:}publicinterfaceVolumeProgressInterface{更新音量调节进度voidupdatVolumeProgress(intindex);}}
  Layout布局如下:?xmlversion1。0encodingutf8?LinearLayoutxmlns:androidhttp:schemas。android。comapkresandroidandroid:layoutwidthmatchparentandroid:layoutheightmatchparentandroid:orientationverticalandroid:gravitycenterandroid:ididlyvolumemainandroid:backgroundcolorblackRelativeLayoutandroid:ididrlvolumeandroid:layoutwidth250dpandroid:layoutheight250dpCustomVolumeProgressViewandroid:ididvolumeprogressandroid:layoutcenterHorizontaltrueandroid:layoutcenterVerticaltrueandroid:layoutwidth200dpandroid:layoutheight200dpRelativeLayoutLinearLayout
  MainActivity的主要操作如下:CustomVolumeProgressViewcustomVolumeProgressViewfindViewById(R。id。volumeprogress);customVolumeProgressView。setProgressSync(66);
投诉 评论 转载

上海艾录一年期首发限售股刚解禁,东方证券便计划大举减持,牛散记者张艺马一苇编辑上海艾录(301062。SZ)一年期首发限售股刚解禁,重要股东便提出了大比例减持计划。9月16日,上海艾录公告称,股东东方证券及其一致行动人……恒大是所有原罪?媒体人离了恒大,广州队越来越像理想中的球队1月2日,足球媒体人苗原在个人社交账号中发文称:离了恒大,广州队越来越像理想中的足球俱乐部了!有球迷评论称:相信广州足球明天会更好!广州球迷永远是你们最坚强的后盾!;而苗……AndroidAPP显示自定义圆弧进度条(可点击,可滑动)效果图:实现思路:1。定义一个画外弧的画笔,使用画笔画出圆弧UI2。定义一个画内圆(灰色)的画笔,使用画笔画出内圆UI3。定义一个画圆点的画笔,使用画笔……能量也有静止质量能量也有静止质量科学家设想过一个实验:在一个隔热的耐高温高压的箱子里,放入小型原子弹,然后称一下箱子的重量。之后用特殊的方式把原子弹引爆,当然由于箱子很坚固,原子弹只能在……帮助牙齿延长寿命的好方法牙齿保健操据调查显示,如果人能活到80岁,牙齿的平均寿命却只能到60岁,可能你会担心失去牙齿怎么吃好东西,如何在我们头发花白时还能有一口好牙呢?牙齿保健操是少不了的。同眼保健操保护眼睛一……女性3个部位的毛发越浓密,可能越长寿,很少有人能达到女人的老化比男人要快,所以要注重保养。人的年纪越大,身体的各项功能就会慢慢衰退,所以保养身体就显得尤为重要。正所谓四十多岁,四十多岁的女人,如果不注意保养,很有可能……12个月!从失业到2亿粉丝据雅虎财经网站报道,日前,世界最大的加密货币交易所币安(Binance)宣布,聘请生活在意大利的塞内加尔籍创作者卡比莱姆(KhabyLame)成为其全球品牌大使。这位在TikT……文案微信置顶文案21。星河非昨夜,山河共从容。2。渐渐温柔,克制、朴素、不问、不怨、不记。3。向海风许愿在山海相见。4。七月不写天气炎热,不写骄阳似火,只写风景如画,细雨绵绵。……黄海打造的新款代步小车,外观很卡通可爱,5门4座,续航180在十几年前,黄海汽车通过多款SUV车型开始走进乘用车市场领域,不过黄海SUV车型没能坚持多久。目前黄海汽车主要是主打商用车领域,客车和皮卡。在工信部最新公布的第359批新车申报……杜兰特三弟,恭喜你夺冠成功!欧文早知如此,何必当初?本故事为NBA新闻改编的小品,只为逗大家一乐,不喜勿喷!篮网经理:纳帅,告诉你一个坏消息,登登新冠了!米神新冠了,还有咱们今天打猛龙只有8人能上场!纳什:what?……12道家常菜的做法,6热菜,4凉菜,2汤,简单易学,适合上班今天蓉儿为大家分享12道家常菜做法,热菜凉菜热汤都有,做法简单上手,跟着学起来吧!6热菜第1道:鸡翅焖面这个鸡翅焖面是饭菜一体,面条当主食,鸡翅当菜,饼皮非常……喜讯,2022成结婚元年!开年才2个多月,已有近20对明星官2022年才过去2个多月,就有快20对明星宣布或已经结婚!所以明星扎堆官宣结婚这是2022年的流行趋势吗?那么让我们一起来看看具体都是哪些明星吧!朴信惠和崔泰俊1月……
仙女座星系正向我们飞来,碰撞后地球将是什么结局?人类会怎样?月球陨石赏析NBA新规不再对各队主教练有着装要求,教练指挥比赛随便穿了张常宁吴冠希大婚!姚明提霸气要求,喊话多生几个,全部留在篮坛喝水不多,经常夜起要注意什么?MIUI13。5要来了,新logo曝光变了,小米12等有望首振德通威利好!但股市没有雄起!太缺少信心了小焓谈后悔盘点2023年值得去的25个旅游目的地如何为您选择好的蓝牙耳机,注意这几点可以经得起使用的音频体验时光匆匆,往事悠悠,这些低调的古村落,每个都是区别于城市的独半决赛4战全胜!决赛对阵樊vs王,孙vs陈,谁能笑到最后?天津武清与杭州西湖异曲同工的南湖公园,寒冬美景尽收眼底怎么查QQ和微信的聊天记录(如何恢复微信聊天记录)淘宝卖家如何查看自己的店铺信用等级赛拉斯波特对库里防守不错,格林不能对自己感到太失望福岛核辐射可通过日本鼠蛇得到监测读完平凡的世界小孩贫血缺铁的症状表现抛妇产后多久可以使用收腹带呢小企鹅软陶手工制作教程老牛不能吃嫩草承租人可以解除租赁合同吗?保护环境

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利