安卓進度條樣式開發

一、優化默認進度條外觀

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/zh-hk/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

發表回復

登錄後才能評論