安卓进度条样式开发

一、优化默认进度条外观

Android中提供了默认的进度条,但其外观简单、单调,不能满足用户的个性化需求。因此,我们需要对默认的进度条样式进行优化。

首先,我们可以使用

标签重新定义进度条的颜色和形状,为其加上背景颜色或边框线条,以增强其可视性和美观度。

#0066CC#005299#FF4081@style/MyProgressBarfalse48dp48dp@drawable/custom_progress

通过以上代码的设置,我们可以自定义进度条的颜色与形状,使其具备更好的可见性与美观度。

二、使用动态图形交互进度条

除了改变进度条样式的外观,我们也可以使用动态图形交互,来增强用户的体验感。例如,可以运用Bezier曲线和属性动画技术,来实现一个弧形的进度条。


以上代码中,我们使用了一个自定义的View和自定义属性,实现了一个弧形的进度条。通过属性动画,可以实现进度条的平滑过渡,同时可在进度条两端加上标签文字,提供更好的交互体验。

三、使用气泡状进度条

除了弧形进度条,在用户体验过程中,我们也可以设计出一些独特的进度条样式,以增强用户的感官体验。

例如下面的气泡状进度条,就可以使用户更直观地了解到进度条状态的变化,增强其使用体验。


四、总结

通过本文的介绍,我们可以看到,通过默认进度条优化、动态图形交互和独特进度条样式等方面的探索,可以为用户提供更好的体验,使应用更加吸引人。

publicclassArcProgressextendsView{
privatePaintpaint;
privateRectFrectF;
privatefloatstrokeWidth;
privatefloatprogress=0;
privateintmax;
privateintfinishedStrokeColor;
privateintunfinishedStrokeColor;
privateinttextColor;
privatefloattextSize;
privateStringtext;
privateintarc_angle=270;
privateintstart_angle=135;

publicArcProgress(Contextcontext){
this(context,null);
}

publicArcProgress(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}

publicArcProgress(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);

paint=newPaint();
rectF=newRectF();

TypedArraytypedArray=context.obtainStyledAttributes(attrs,R.styleable.ArcProgress,defStyleAttr,0);
strokeWidth=typedArray.getDimension(R.styleable.ArcProgress_arcWidth,10f);
progress=typedArray.getFloat(R.styleable.ArcProgress_progress,0);
max=typedArray.getInt(R.styleable.ArcProgress_max,100);
finishedStrokeColor=typedArray.getColor(R.styleable.ArcProgress_finishedStrokeColor,Color.WHITE);
unfinishedStrokeColor=typedArray.getColor(R.styleable.ArcProgress_unfinishedStrokeColor,Color.WHITE);
textColor=typedArray.getColor(R.styleable.ArcProgress_android_textColor,Color.WHITE);
textSize=typedArray.getDimension(R.styleable.ArcProgress_android_textSize,20f);

typedArray.recycle();
}

@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);

intwidth=getWidth();
intheight=getHeight();

intcx=width/2;
intcy=height/2;

intradius=(int)Math.min(cx,cy)-(int)strokeWidth/2;

paint.setStrokeWidth(strokeWidth);
paint.setAntiAlias(true);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStyle(Paint.Style.STROKE);

paint.setColor(finishedStrokeColor);
rectF.set(cx-radius,cy-radius,cx+radius,cy+radius);
canvas.drawArc(rectF,start_angle,progress/(float)max*arc_angle,false,paint);

paint.setColor(unfinishedStrokeColor);
canvas.drawArc(rectF,start_angle+progress/(float)max*arc_angle,arc_angle-progress/(float)max*arc_angle,false,paint);

paint.setStrokeWidth(0);
paint.setColor(textColor);
paint.setTextSize(textSize);
paint.setTextAlign(Paint.Align.CENTER);
canvas.drawText(text,cx,cy+textSize/4,paint);
}

publicvoidsetProgress(floatprogress){
this.progress=progress;
this.text=String.format("%.0f%%",progress/max*100f);
invalidate();
}

publicvoidsetMax(intmax){
this.max=max;
invalidate();
}
}

publicclassBubbleProgressBarextendsView{
privatePaintpaint;
privateRectFrectF;
privatefloatstrokeWidth;

privatefloatprogress=0;
privatefloatmax=100;
privatefloatbubbleWidth;
privatefloatbubbleHeight;
privateintbubbleColor;
privateintbarColor;
privatefloatbarWidth;
privateinttextColor;
privatefloattextSize;

publicBubbleProgressBar(Contextcontext){
this(context,null);
}

publicBubbleProgressBar(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}

publicBubbleProgressBar(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);

paint=newPaint();
paint.setAntiAlias(true);

rectF=newRectF();

TypedArraytypedArray=context.obtainStyledAttributes(attrs,R.styleable.BubbleProgressBar,defStyleAttr,0);

bubbleWidth=typedArray.getDimension(R.styleable.BubbleProgressBar_bubbleWidth,24);
bubbleHeight=typedArray.getDimension(R.styleable.BubbleProgressBar_bubbleHeight,36);
bubbleColor=typedArray.getColor(R.styleable.BubbleProgressBar_bubbleColor,Color.parseColor("#1abc9c"));
barColor=typedArray.getColor(R.styleable.BubbleProgressBar_barColor,Color.parseColor("#bdc3c7"));
barWidth=typedArray.getDimension(R.styleable.BubbleProgressBar_barWidth,10);
textSize=typedArray.getDimension(R.styleable.BubbleProgressBar_android_textSize,18);
textColor=typedArray.getColor(R.styleable.BubbleProgressBar_android_textColor,Color.WHITE);

typedArray.recycle();
}

@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
intwidthMode=MeasureSpec.getMode(widthMeasureSpec);
intwidthSize=MeasureSpec.getSize(widthMeasureSpec);

intheightMode=MeasureSpec.getMode(heightMeasureSpec);
intheightSize=MeasureSpec.getSize(heightMeasureSpec);

intwidth;
intheight;

if(widthMode==MeasureSpec.EXACTLY){
width=widthSize;
}else{
width=(int)bubbleWidth*3;
}

if(heightMode==MeasureSpec.EXACTLY){
height=heightSize;
}else{
height=(int)bubbleHeight;
}

setMeasuredDimension(width,height);
}

@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);

intwidth=getWidth();
intheight=getHeight();

paint.setStrokeWidth(0);
paint.setStyle(Paint.Style.FILL);

//画气泡
paint.setColor(bubbleColor);
canvas.drawRoundRect(rectF,bubbleWidth/2,bubbleWidth/2,paint);

//画进度条背景
paint.setColor(barColor);
rectF.set(bubbleWidth/2,height/2-barWidth/2,width-bubbleWidth/2,height/2+barWidth/2);
canvas.drawRoundRect(rectF,barWidth/2,barWidth/2,paint);

//画进度条
paint.setColor(bubbleColor);
rectF.set(bubbleWidth/2,height/2-barWidth/2,progress/max*(width-bubbleWidth)+bubbleWidth/2,height/2+barWidth/2);
canvas.drawRoundRect(rectF,barWidth/2,barWidth/2,paint);

//画进度百分比
paint.setColor(textColor);
paint.setTextSize(textSize);
paint.setTextAlign(Paint.Align.CENTER);

Stringtext=(int)(progress/max*100)+"%";
floattextWidth=paint.measureText(text);
floatx=progress/max*(width-bubbleWidth)+bubbleWidth/2;
floaty=height/2+textSize/2;
canvas.drawText(text,x,y,paint);
}

publicfloatgetProgress(){
returnprogress;
}

publicvoidsetProgress(floatprogress){
this.progress=progress;
if(this.progress>max){
this.progress=max;
}
invalidate();
}

publicfloatgetMax(){
returnmax;
}

publicvoidsetMax(floatmax

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/258048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-15 12:48
下一篇 2024-12-15 12:48

相关推荐

  • 如何使用HTML修改layui内部样式影响全局

    如果您想要使用layui来构建一个美观的网站或应用,您可能需要使用一些自定义CSS来修改layui内部组件的样式。然而,修改layui组件的样式可能会对整个页面产生影响,甚至可能破…

    编程 2025-04-29
  • JFXtras样式——美化JavaFX应用的必备神器

    本文将从多个方面对JFXtras样式进行详细的阐述,教你如何使用JFXtras样式来美化你的JavaFX应用。无需任何前置知识,让我们一步步来了解。 一、简介 JFXtras是一个…

    编程 2025-04-27
  • 如何优雅地改变鼠标指针样式

    我们在网页设计中,经常会遇到需要改变鼠标指针样式的情况,比如当我们将鼠标移动到一个链接上时,我们希望鼠标指针变成手型,这时我们就需要用到改变鼠标指针样式的技巧。本文将从多个方面详细…

    编程 2025-04-25
  • CSS URL编写技巧:打造独特的样式链接

    在我们的网页设计中,样式链接(CSS URL)是一个非常重要的部分。它不仅可以让我们的网页变得更加美观,还可以提高用户的体验。但是,如何打造独特的样式链接呢?本文将从以下几个方面进…

    编程 2025-04-23
  • CSS行内样式详解

    一、概述 CSS(Cascading Style Sheets)是一种用于描述文档展示样式的语言。在网页制作中,CSS样式是不可或缺的一部分。CSS有三种使用方式:行内、内嵌和外部…

    编程 2025-04-22
  • 如何使用CSS的nth-last-child选择器进行网页元素样式的控制

    CSS是一个强大的网页样式描述语言,对于网页的布局和样式有着非常重要的作用。而选择器是CSS中最重要的部分之一,通过不同的选择器,我们可以对网页中的元素进行特定的选择和样式控制。其…

    编程 2025-04-18
  • JavaScript修改样式属性

    一、修改元素的样式属性 在前端开发中,有时候需要通过 JavaScript 来修改元素的样式,这对于网页的交互效果优化非常重要。如何使用 JavaScript 修改元素的样式属性呢…

    编程 2025-04-13
  • echarts图例样式详解

    一、echarts图例的基本样式 echarts图例是在图表上方的一组标记,它用于解释数据系列,并允许用户控制数据系列的可见性。在样式上,echarts图例具有多种配置选项。比如,…

    编程 2025-04-13
  • normalize函数:使CSS样式统一化

    一、什么是normalize函数 normalize函数是一个CSS库,它可以在HTML页面中消除默认的浏览器样式,从而为所有元素提供一致的CSS样式。normalize函数的目的…

    编程 2025-04-12
  • Vue引入CSS样式的方法

    一、在Vue中使用内联样式 Vue组件可以通过内联样式添加到页面上,可以直接在组件模板中使用style绑定值(v-bind:style)为元素动态绑定 CSS 样式。以下是示例代码…

    编程 2025-04-12

发表回复

登录后才能评论