




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Android模擬實(shí)現(xiàn)華為系統(tǒng)升級進(jìn)度條目錄前言實(shí)現(xiàn)步驟1.用DashPathEffect給paint加上虛線效果2.畫出進(jìn)度條3.繪制文字4.加入動畫效果完整代碼
前言
之前用華為Android系統(tǒng)的時候總是會想到這種虛線進(jìn)度條是怎么實(shí)現(xiàn)的,因?yàn)橹苯佑胏anvas的drawArc方法畫出來的是實(shí)線,所以最近在網(wǎng)上搜了很多進(jìn)度條相關(guān)的文章,也了解到了其中的原理,下面分享給大家。下面這兩篇文章是我之前寫的Android進(jìn)度條相關(guān)的文章,有興趣的朋友們可以看看:
Android實(shí)現(xiàn)絢麗的自定義進(jìn)度條
詳解Android如何自定義view實(shí)現(xiàn)圓形進(jìn)度條
下面開始講解虛線進(jìn)度條的實(shí)現(xiàn)方法,首先看一張圖:
實(shí)現(xiàn)步驟
大家可以先想想這種進(jìn)度條是怎么實(shí)現(xiàn)的?網(wǎng)上有各種各樣的方法,也有人用path的lineTo()方法實(shí)現(xiàn)了類似的效果。但是我個人覺得canvas的drawArc方法也是個不錯的選擇,適合自己的才是最好的。
canvas.drawArc(rectF,0,process,false,mPaint);
閱讀了大量文章,最后發(fā)現(xiàn)改變paint的樣式是最簡單好用的方法。給paint設(shè)置一個effect就好了。
1.用DashPathEffect給paint加上虛線效果
DashPathEffectdashPathEffect=newDashPathEffect(newfloat[]{8,6},0);
mPaintBack.setPathEffect(dashPathEffect);
build一下項目,看到的結(jié)果是這樣的:
能實(shí)現(xiàn)這個效果就大功告成了,如果看過我前面兩篇文章的朋友們就知道,后面的步驟就簡單了,加個進(jìn)度條和動畫效果就可以了。
privatevoiddrawBack(Canvascanvas){
RectFrectF=newRectF(strokeWidth,strokeWidth,getWidth()-strokeWidth,getHeight()-strokeWidth);
PathEffecteffects=newDashPathEffect(newfloat[]{8,6},0);
mPaintBack.setPathEffect(effects);
canvas.drawArc(rectF,0,360,false,mPaintBack);
2.畫出進(jìn)度條
畫進(jìn)度條和畫背景完全一樣,只是畫筆顏色和小點(diǎn)個數(shù)不一樣。
代碼如下:
privatevoiddrawProgress(Canvascanvas){
RectFrectF=newRectF(strokeWidth,strokeWidth,getWidth()-strokeWidth,getHeight()-strokeWidth);
PathEffecteffects=newDashPathEffect(newfloat[]{8,6},0);
mPaint.setPathEffect(effects);
canvas.drawArc(rectF,0,process,false,mPaint);
3.繪制文字
接下來是繪制文字,實(shí)現(xiàn)文字居中的效果。思路是計算出圓心,調(diào)用canvas.drawText的方法就能在canvas上面繪制文字了。這里不需要更新進(jìn)度文字,所以就更省事了。
EMUI下面的10.0.0也是一樣的方法,只是給Y坐標(biāo)加一下55,往下移一點(diǎn)就好。
//繪制文字
privatevoiddrawText(Canvascanvas){
intmTxtWidth=getTextWidth();
intmTxtHeight=getTextHeight();
intx=getWidth()/2-mTxtWidth/2;
inty=getHeight()/2+mTxtHeight/4;
canvas.drawText(getResources().getString(R.string.defaultTextEmui),x,y,mPaintText);
//繪制下方文字
privatevoiddrawTextBlow(Canvascanvas){
intmTxtWidth=getTextWidthBlow();
intmTxtHeight=getTextHeight();
intx=getWidth()/2-mTxtWidth/2;
inty=getHeight()/2+mTxtHeight/4+55;
canvas.drawText(getResources().getString(R.string.defaultTextBelow),x,y,mPaintTextLevel);
4.加入動畫效果
/**
*設(shè)置動畫效果
publicvoidstart(){
ValueAnimatorvalueAnimator=ValueAnimator.ofInt(0,360);
valueAnimator.setDuration(duration);
valueAnimator.setInterpolator(newLinearInterpolator());
valueAnimator.addUpdateListener(animation-{
process=(int)animation.getAnimatedValue();
invalidate();
valueAnimator.start();
最終效果:
完整代碼
packagecom.example.floatingwindow.widget;
importandroid.animation.ValueAnimator;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.DashPathEffect;
importandroid.graphics.Paint;
importandroid.graphics.PathEffect;
importandroid.graphics.RectF;
importandroid.util.AttributeSet;
importandroid.util.TypedValue;
importandroid.view.View;
importandroid.view.animation.LinearInterpolator;
importandroidx.annotation.Nullable;
importcom.example.floatingwindow.R;
publicclassDottedLineProgressBarextendsView{
privatePaintmPaint;
privatePaintmPaintBack;
privatePaintmPaintText;
privatePaintmPaintTextLevel;
privateintstrokeWidth=30;
privateinttextSize=22;
privateinttextSizeBlow=15;
privatelongduration=3500;
privateintprocess;
publicDottedLineProgressBar(Contextcontext){
super(context);
init();
publicDottedLineProgressBar(Contextcontext,@NullableAttributeSetattrs){
super(context,attrs);
init();
publicDottedLineProgressBar(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
init();
publicvoidsetStrokeWidth(intwidth){
strokeWidth=width;
publicvoidsetTextSize(inttextSize){
this.textSize=textSize;
publicvoidsetDuration(longduration){
this.duration=duration;
publicvoidsetTextSizeBlow(inttextSizeBlow){
this.textSizeBlow=textSizeBlow;
//初始化畫筆
privatevoidinit(){
mPaintBack=newPaint();//圓角矩形
mPaintBack.setColor(getResources().getColor(R.color.gray));//圓角矩形顏色
mPaintBack.setAntiAlias(true);//抗鋸齒效果
mPaintBack.setStyle(Paint.Style.STROKE);//設(shè)置畫筆樣式
mPaintBack.setStrokeWidth(strokeWidth);//設(shè)置畫筆寬度
mPaint=newPaint();
mPaint.setColor(getResources().getColor(R.color.blue));
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(strokeWidth);
mPaintText=newPaint();
mPaintText.setAntiAlias(true);
mPaintText.setStyle(Paint.Style.FILL);
mPaintText.setColor(getResources().getColor(R.color.blue));
mPaintText.setTextSize(sp2px(textSize));
mPaintTextLevel=newPaint();
mPaintTextLevel.setAntiAlias(true);
mPaintTextLevel.setStyle(Paint.Style.FILL);
mPaintTextLevel.setColor(getResources().getColor(R.color.gray));
mPaintTextLevel.setTextSize(sp2px(textSizeBlow));
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
drawBack(canvas);
drawProgress(canvas);
drawText(canvas);
drawTextBlow(canvas);
privatevoiddrawBack(Canvascanvas){
RectFrectF=newRectF(strokeWidth,strokeWidth,getWidth()-strokeWidth,getHeight()-strokeWidth);
PathEffecteffects=newDashPathEffect(newfloat[]{8,6},0);
mPaintBack.setPathEffect(effects);
canvas.drawArc(rectF,0,360,false,mPaintBack);
privatevoiddrawProgress(Canvascanvas){
RectFrectF=newRectF(strokeWidth,strokeWidth,getWidth()-strokeWidth,getHeight()-strokeWidth);
PathEffecteffects=newDashPathEffect(newfloat[]{8,6},0);
mPaint.setPathEffect(effects);
canvas.drawArc(rectF,0,process,false,mPaint);
//繪制文字
privatevoiddrawText(Canvascanvas){
intmTxtWidth=getTextWidth();
intmTxtHeight=getTextHeight();
intx=getWidth()/2-mTxtWidth/2;
inty=getHeight()/2+mTxtHeight/4;
canvas.drawText(getResources().getString(R.string.defaultTextEmui),x,y,mPaintText);
//繪制下方文字
privatevoiddrawTextBlow(Canvascanvas){
intmTxtWidth=getTextWidthBlow();
intmTxtHeight=getTextHeight();
intx=getWidth()/2-mTxtWidth/2;
inty=getHeight()/2+mTxtHeight/4+55;
canvas.drawText(getResources().getString(R.string.defaultTextBelow),x,y,mPaintTextLevel);
privateintgetTextWidth(){
Stringtext=getResources().getString(R.string.defaultTextEmui);
return(int)mPaintText.measureText(text,0,text.length());
privateintgetTextWidthBlow(){
Stringtext=getResources().getString(R.string.defaultTextBelow);
return(int)mPaintTextLevel.measureText(text,0,text.length());
privateintgetTextHeight(){
Paint.FontMetricsfm=mPaintText.getFontMetrics();
return(int)Math.ceil(fm.descent-fm.ascent);
privateintsp2px(intsp){
return(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,
getResources().getDisplayMetrics());
*設(shè)置動畫效果
publicvoidstart(){
ValueAnimatorvalueAnimator=ValueAnimator.ofInt(0,360);
valueAnimator.setDuration(duration
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2026學(xué)年湖北省部分高中高一上學(xué)期開學(xué)分班考試英語試題(解析版)
- 推動科技創(chuàng)新投入承諾書6篇
- 2025年鶴壁市山城區(qū)城市管理局招聘看護(hù)人員30人模擬試卷及完整答案詳解一套
- 2025湖南省衛(wèi)生健康委直屬事業(yè)單位高層次人才公開招聘218人考前自測高頻考點(diǎn)模擬試題參考答案詳解
- 我的精彩演講稿分享7篇
- 研究生錄取協(xié)議書7篇
- 2025年金華義烏市中心醫(yī)院招聘護(hù)理全日制本科崗位10人模擬試卷附答案詳解
- 2025年煙臺萊陽市衛(wèi)生健康局所屬事業(yè)單位公開招聘工作人員(35人)考前自測高頻考點(diǎn)模擬試題附答案詳解
- 2025湖南湘能多經(jīng)產(chǎn)業(yè)(集團(tuán))有限公司高校畢業(yè)生招聘(第三批)模擬試卷及答案詳解(名校卷)
- 2025昆明市盤龍區(qū)東華街道社區(qū)服務(wù)中心見習(xí)崗位招錄(若干)考前自測高頻考點(diǎn)模擬試題及答案詳解(網(wǎng)校專用)
- 內(nèi)墻涂料分包施工合同
- 實(shí)驗(yàn)室裝修工程設(shè)計書
- 退休人員出國探親申請書
- 經(jīng)陰道全子宮切除術(shù)專家共識(2024年版)解讀
- 2024年新華東師大版七年級上冊數(shù)學(xué)全冊教案(新版教材)
- 《看圖找關(guān)系》(教學(xué)設(shè)計)-2024-2025學(xué)年六年級上冊數(shù)學(xué)北師大版
- 合伙人之間合作合同范本
- 電商直播帶貨的營銷策略手冊
- (正式版)QC∕T 625-2024 汽車用涂鍍層和化學(xué)處理層
- LYT 2241-2014 森林生態(tài)系統(tǒng)生物多樣性監(jiān)測與評估規(guī)范
- 2024年上海市中考語文試題卷(含答案)
評論
0/150
提交評論