一种带范围的进度条的实现方法与流程

文档序号:16325230发布日期:2018-12-19 05:53阅读:213来源:国知局
本发明涉及进度条计算及呈现
技术领域
:,具体说是一种带范围的进度条的实现方法。
背景技术
:android输入控件是一种用于人机交互的元件,androidsdk为此提供了各种各样的输入控件,包括:原生控件,例如:文本域(textview)、按钮(button)、编辑框(edittext)、单选按钮(radiobutton)、列表控件(listview)以及显示图片控件(imageview)等,布局控件,例如:linearlayout、relativelayout、framelayout以及不太常用的tablelayout等等。利用这些基础的输入控件,能实现普通的布局展示,但对于特殊的应用场景,比如复杂的动画展示,或者特别的图形图像要求,利用这些基础的输入控件无法实现,因此就需要自定义控件来满足特别的需求。在android系统中,自定义控件,主要包括两类:第一类,组合自定义控件,是指使用系统提供的各种界面控件,通过自定义封装成包括多个系统控件的自定义控件,代码在内部处理各子控件的交互,简化使用。第二类,自绘制控件,是指通过继承系统提供的各种界面控件,在控件的测量、布局、绘制三个方法中,使用代码进行测量、绘制、处理交互事件的自定义控件。自绘制控件能提供比系统控件更新颖的界面、更丰富的交互方式。进度条控件是安卓的基础控件之一,具体说是progressbar控件,其继承与view类。进度条在app中非常常见,例如下载进度、加载图片、打开文章、打开网页等等……都需要这么一个效果让用户知道我们的app正在读取,以构造良好的交互。如果没有这样一个效果的话,用户没法知道东西有没有下载好、图片加载了没有、文章打开了没……会让用户很不爽。基于这样的情景,为了丰富进度条的呈现效果,满足用户个性化选择的需求,拟开发新式样的进度条控件。技术实现要素:针对现有技术中存在的缺陷,本发明的目的在于提供一种带范围的进度条的实现方法,自定义进度条控件继承与android系统提供的seekbar控件,重写ondraw回调,对外提供接口,调用接口则显示带进度的进度条,否则显示正常的进度条,用户可自定义相关参数,扩展性好,兼容现有进度条,易于使用、维护。为达到以上目的,本发明采取的技术方案是:一种带范围的进度条的实现方法,其特征在于,包括如下步骤:定义边框控件kwrangeseekbar,继承android系统提供的kwseekbar控件,在onsizechanged回调中获取控件kwrangeseekbar的高度h,进度条可用的区域available,进度条总的宽度减去左右内边距,得到可用的进度范围,获取标识范围的左边标记的横坐标mtagleft,mtagleft=getx(mstartprogress),获取标识范围的右边标记的横坐标mtagright,mtagright=getx(mendprogress),其中,mstartprogress是外部传递给kwrangeseekbar进度条的起始进度,mendprogress是外部传递给kwrangeseekbar进度条的结束进度,getx是根据进度获取横坐标的函数,在ontouchevent的回调中,处理用户抬起的操作,提供对外接口settime,在ondraw回调中,绘制进度条的三种进度值,具体包括:绘制进度条背景,根据变量布尔型变量israngeseekbar绘制二级进度条,绘制滑块和带范围的标记。在上述技术方案的基础上,在边框控件kwrangeseekbar中,定义画笔mpaint和mpainttag的画笔paint对象,用来绘制进度条和竖线标记;定义mrectleft,mrectright,表示左边和右边圆角矩形的带颜色区域,是rectf类型的变量;定义mstartprogress,mendprogress,进度范围的起始值和最大值,类型是int。在上述技术方案的基础上,mcentery=h/2;表示控件kwrangeseekbar的中间的高度,绘制进度条的时候,在这个高度上绘制。在上述技术方案的基础上,getx函数的具体步骤为:调用seekbar控件的系统apigetmax,获取进度条的最大进度值max,计算出当前进度和总进度的比例sacle,scale=progress*1.0f/max,progress是输入参数,表示当前的进度,计算scale*available+getpaddingleft(),返回计算结果,就根据进度值计算出了对应进度条的左边标记的横坐标值mtagleft,available是可用的进度条的宽度,getpaddingleft()是seekbar控件提供的获取左边距的api,按如上算法相应的计算出对应进度条的右边标记的横坐标值mtagright。在上述技术方案的基础上,处理用户抬起的操作时,调用getprogress根据当前的用户点击的横坐标,获取对应的进度值,具体步骤如下:设touchx是点击的横坐标值,getpaddingleft获取左边距,这样最大进度除以可用进度条的宽度,再乘以当前触摸的横坐标,就计算出了横坐标对应的进度值,获取了新的进度值以后,调用seekto对其进行校正,具体步骤如下:当前进度如果小于范围的最小进度mstartprogress,就调用seekbar的setprogress设置最小进度,如果大于范围的最大进度,mendprogress,就调用seekbar的setprogress设置最大进度,如果上边两种情况都不属于,就调用调用seekbar的setprogress设置当前进度;如果newprogress小于最小进度或者大于最大进度,返回true,代表处理了该操作,并且刷新进度条。在上述技术方案的基础上,对外接口settime,提供以下可接受的参数:settime(intstarttime,intendtime,intduration)参数starttime是进度范围的开始时间,endtime是进度条范围的结束时间,duration是歌曲的总时长。在上述技术方案的基础上,绘制进度条背景,具体包括:给画笔设置颜色,mpaint.setcolor(color_progress_default);在进度条的画布canvas,调用drawline绘制一条直线,getpaddingleft是进度条的内边距,mcentery是进度条的高度的一半,getwidth()-getpaddingright()是进度条宽度与右边距的差值,这样就绘制了一条直线,作为进度条的背景,canvas.drawline(getpaddingleft(),mcentery,getwidth()-getpaddingright(),mcentery,mpaint)。在上述技术方案的基础上,根据变量布尔型变量israngeseekbar绘制二级进度条,具体包括:根据是否是带范围的进度条变量israngeseekbar来分别绘制进度条,如果是带范围的,就从范围的左标记开始绘制,如果不是就从左边距开始绘制,调用getx处理二级进度条的进度msecondprogress,得到进度值对应的横坐标secondprogressx,给画笔设置预设的二级进度条颜色值color_second_progress,调用画布canvas的drawline绘制线条。在上述技术方案的基础上,绘制滑块和带范围的标记具体包括:根据是否是带范围的进度条变量israngeseekbar来分别绘制滑块和带范围的标记,调用seekbar提供的获取当前进度的apigetprogress给curprogress赋值,调用根据进度获取横坐标函数getx(curprogress)给curx赋值,是则:实时绘制切换的进度,预设为黄色线条mpaint.setcolor(color_tag_yello),绘制时,如果当前进度mstartprogress大于进度范围的开始值mstartprogress,小于等于mendprogress结束值,就从进度范围的左边标记mtagleft绘制到当前进度curx的像素值,如果当前进度值大于进度范围的最大值mendprogress,就从进度范围的左标记绘制到右侧标记,防止超出范围;绘制两条标记线,mhalfheight是预设的标记线的高度值,中心mcentery减去高度mhalfheight到mcentery加上mhalfheight绘制左边的竖线标记,同理绘制右边标记,绘制滑块:调用seekbar提供的drawthumb绘制滑块;不是则:实时绘制切换的进度,预设为黄色线条mpaint.setcolor(color_tag_yello),绘制滑块:调用seekbar提供的drawthumb绘制滑块。本发明所述的带范围的进度条的实现方法,自定义进度条控件继承与android系统提供的seekbar控件,重写ondraw回调,对外提供接口,调用接口则显示带进度的进度条,否则显示正常的进度条,用户可自定义相关参数,扩展性好,兼容现有进度条,易于使用、维护。附图说明本发明有如下附图:图1本发明的流程图。具体实施方式以下结合附图对本发明作进一步详细说明。如图1所示,本发明所述的带范围的进度条的实现方法,包括如下步骤:定义边框控件kwrangeseekbar,继承android系统提供的kwseekbar控件,在onsizechanged回调中获取控件kwrangeseekbar的高度h,进度条可用的区域available,进度条总的宽度减去左右内边距,得到可用的进度范围,获取标识范围的左边标记的横坐标mtagleft,mtagleft=getx(mstartprogress),获取标识范围的右边标记的横坐标mtagright,mtagright=getx(mendprogress),其中,mstartprogress是外部传递给kwrangeseekbar进度条的起始进度,mendprogress是外部传递给kwrangeseekbar进度条的结束进度,getx是根据进度获取横坐标的函数,在ontouchevent的回调中,处理用户抬起的操作,提供对外接口settime,在ondraw回调中,绘制进度条的三种进度值,具体包括:绘制进度条背景,根据变量布尔型变量israngeseekbar绘制二级进度条,绘制滑块和带范围的标记。在上述技术方案的基础上,在边框控件kwrangeseekbar中,定义画笔mpaint和mpainttag的画笔paint对象,用来绘制进度条和竖线标记;定义mrectleft,mrectright,表示左边和右边圆角矩形的黄色区域,是rectf类型的变量;定义mstartprogress,mendprogress,进度范围的起始值和最大值,类型是int。在上述技术方案的基础上,mcentery=h/2;表示控件kwrangeseekbar的中间的高度,绘制进度条的时候,在这个高度上绘制。在上述技术方案的基础上,getx函数的具体步骤为:调用seekbar控件的系统apigetmax,获取进度条的最大进度值max,计算出当前进度和总进度的比例sacle,scale=progress*1.0f/max,progress是输入参数,表示当前的进度,计算scale*available+getpaddingleft(),返回计算结果,就根据进度值计算出了对应进度条的左边标记的横坐标值mtagleft,available是可用的进度条的宽度,getpaddingleft()是seekbar控件提供的获取左边距的api,按如上算法相应的计算出对应进度条的右边标记的横坐标值mtagright。例如,计算对应进度条的左边标记的横坐标值mtagleft可采用如下代码:privatefloatgetx(intprogress){intmax=getmax();floatscale=progress*1.0f/max;returnscale*available+getpaddingleft();}。例如,计算对应进度条的右边标记的横坐标值mtagright可采用如下代码:privatefloatgetx(intprogress){intmax=getmax();floatscale=progress*1.0f/max;returnscale*available+getpaddingright();}。在上述技术方案的基础上,处理用户抬起的操作时,调用getprogress根据当前的用户点击的横坐标,获取对应的进度值,具体步骤如下:设touchx是点击的横坐标值,getpaddingleft获取左边距,这样最大进度除以可用进度条的宽度,再乘以当前触摸的横坐标,就计算出了横坐标对应的进度值,获取了新的进度值以后,调用seekto对其进行校正,具体步骤如下:当前进度如果小于范围的最小进度mstartprogress,就调用seekbar的setprogress设置最小进度,如果大于范围的最大进度,mendprogress,就调用seekbar的setprogress设置最大进度,如果上边两种情况都不属于,就调用调用seekbar的setprogress设置当前进度;如果newprogress小于最小进度或者大于最大进度,返回true,代表处理了该操作,并且刷新进度条。例如,可采用如下代码:intnewprogress=getprogress(event.getx());seekto(newprogress);if(newprogress&lt;mstartprogress||newprogress&gt;mendprogress){super.ontouchevent(event);invalidate();returntrue;}privateintgetprogress(floattouchx){floatx=touchx-getpaddingleft();return(int)(getmax()*1.0f/available*x);}privatevoidseekto(intprogress){if(progress&lt;mstartprogress){super.setprogress(mstartprogress);}elseif(progress&gt;mendprogress){super.setprogress(mendprogress);}else{super.setprogress(progress);}}。在上述技术方案的基础上,对外接口settime,提供以下可接受的参数:settime(intstarttime,intendtime,intduration)参数starttime是进度范围的开始时间,endtime是进度条范围的结束时间,duration是歌曲的总时长。使用时,外部调用该接口以后,设置布尔型变量israngeseekbar为true,代表当前是带范围的进度条,如果不调用该接口,israngeseekbar默认是false,就是正常的进度条。在上述技术方案的基础上,绘制进度条背景,具体包括:给画笔设置颜色,mpaint.setcolor(color_progress_default);color_progress_default是预设的百分之10不透明度的白色,在进度条的画布canvas,调用drawline绘制一条直线,getpaddingleft是进度条的内边距,mcentery是进度条的高度的一半,getwidth()-getpaddingright()是进度条宽度与右边距的差值,这样就绘制了一条直线,作为进度条的背景,canvas.drawline(getpaddingleft(),mcentery,getwidth()-getpaddingright(),mcentery,mpaint)。在上述技术方案的基础上,根据变量布尔型变量israngeseekbar绘制二级进度条,具体包括:根据是否是带范围的进度条变量israngeseekbar来分别绘制进度条,如果是带范围的,就从范围的左标记开始绘制,如果不是就从左边距开始绘制,调用getx处理二级进度条的进度msecondprogress,得到进度值对应的横坐标secondprogressx,给画笔设置预设的二级进度条颜色值color_second_progress,color_second_progress是纯白色的50%的不透明度颜色,调用画布canvas的drawline绘制线条。例如,可采用如下代码:if(israngeseekbar){floatsecondprogressx=getx(msecondprogress);mpaint.setcolor(color_second_progress);canvas.drawline(mtagleft,mcentery,secondprogressx,mcentery,mpaint);}else{floatsecondprogressx=getx(msecondprogress);mpaint.setcolor(color_second_progress);canvas.drawline(getpaddingleft(),mcentery,secondprogressx,mcentery,mpaint);}。在上述技术方案的基础上,绘制滑块和带范围的标记具体包括:根据是否是带范围的进度条变量israngeseekbar来分别绘制滑块和带范围的标记,调用seekbar提供的获取当前进度的apigetprogress给curprogress赋值,调用根据进度获取横坐标函数getx(curprogress)给curx赋值,是则:实时绘制切换的进度,预设为黄色线条mpaint.setcolor(color_tag_yello),绘制时,如果当前进度mstartprogress大于进度范围的开始值mstartprogress,小于等于mendprogress结束值,就从进度范围的左边标记mtagleft绘制到当前进度curx的像素值,如果当前进度值大于进度范围的最大值mendprogress,就从进度范围的左标记绘制到右侧标记,防止超出范围;绘制两条标记线,mhalfheight是预设的标记线的高度值,中心mcentery减去高度mhalfheight到mcentery加上mhalfheight绘制左边的竖线标记,同理绘制右边标记,绘制滑块:调用seekbar提供的drawthumb绘制滑块;不是则:实时绘制切换的进度,预设为黄色线条mpaint.setcolor(color_tag_yello),绘制滑块:调用seekbar提供的drawthumb绘制滑块。例如,可采用如下代码:if(israngeseekbar){intcurprogress=getprogress();floatcurx=getx(curprogress);//实时绘制切换的进度,黄色线条mpaint.setcolor(color_tag_yello);if(curprogress>=mstartprogress&&curprogress<=mendprogress){canvas.drawline(mtagleft,mcentery,curx,mcentery,mpaint);}elseif(curprogress&gt;mendprogress){canvas.drawline(mtagleft,mcentery,mtagright,mcentery,mpaint);}//两条标记线mpainttag.setcolor(color_tag_yello);canvas.drawline(mtagleft,mcentery-mhalfheight,mtagleft,mcentery+mhalfheight,mpainttag);mpainttag.setcolor(color_second_progress);canvas.drawline(mtagright,mcentery-mhalfheight,mtagright,mcentery+mhalfheight,mpainttag);//滑块drawthumb(canvas);}else{intcurprogress=getprogress();floatcurx=getx(curprogress);//实时绘制切换的进度,黄色线条mpaint.setcolor(color_tag_yello);canvas.drawline(getpaddingleft(),mcentery,curx,mcentery,mpaint);//滑块drawthumb(canvas);}。其中,color_tag_yello是预设的黄色,开发者可以根据项目需求修改该颜色值。本发明所述控件继承与android系统提供的seekbar控件,滑动事件是使用seekbar的,重写ondraw回调,自己绘制正常的进度条显示和带范围的进度条显示,对外提供一个接口,调用了如果参数符合规范,就会显示带进度的进度条,如果不调用接口就显示正常的进度条,进度条的背景和缓冲进度以及播放进度的颜色和高度,都是可以自己定义和修改的,本控件扩展性好,可以应用在音乐付费的试听里,比如允许试听30秒,显示范围即可,也支持滑动,超出范围,自动回退到最大值或者最小值。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1