android實(shí)現(xiàn)節(jié)點(diǎn)進(jìn)度條效果
本文實(shí)例為大家分享了android實(shí)現(xiàn)節(jié)點(diǎn)進(jìn)度條效果展示的具體代碼,供大家參考,具體內(nèi)容如
代碼:
package utils.android.view.lxz; import java.util.ArrayList; import java.util.List; import com.community.custom.android.R; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; /** * 2015-1-24 * 小林愛(ài) * */ public class NodeProgressBar extends View implements Runnable { private float dn=1f; DisplayMetrics metrics; { metrics=new DisplayMetrics(); ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics); dn=1*3/metrics.density; } /**讀取空進(jìn)度條圖片*/ private BitmapDrawable db_empty; /**View寬度*/ private int viewWidth; /**View高度*/ private int viewHeight; /** * 白色空心圓圖片集合 * */ private List<BitmapDrawable> list_whitecircle ; /** * 藍(lán)色實(shí)心圓圖片集合 * */ private List<BitmapDrawable> list_bluecircle ; /**藍(lán)色進(jìn)度條*/ private BitmapDrawable db_blue; /**進(jìn)度比值 控制藍(lán)色進(jìn)度條*/ private double ratio = 0; /**節(jié)點(diǎn)名稱(chēng)*/ private String[] textArr=new String[]{"等待服務(wù)","服務(wù)中","等待評(píng)價(jià)","成功"}; /**節(jié)點(diǎn)數(shù)*/ private int count=textArr.length;; /**當(dāng)前節(jié)點(diǎn)進(jìn)度*/ private int index = 0; /**X軸對(duì)稱(chēng) 偏移值*/ private int offX=(int) (50/dn); /**Y軸 偏移值*/ private int offY=(int) (70/dn); /**文字與節(jié)點(diǎn) 偏移值*/ private int offTextY=(int) (65/dn); /**白色空心圓偏移值*/ private int offWhiteCirle_y=(int) (-3/dn); /**白色空心進(jìn)度條偏移值*/ private int offWhiteRect_y=(int) (-2/dn); /**白色空心進(jìn)度條偏移值*/ private BitmapDrawable db_blue_half_circle; /**創(chuàng)建一只新畫(huà)筆*/ private Paint paint = new Paint(); /**白色空心圓半徑*/ private int r_white = (int) (76/dn); /**藍(lán)色空心圓半徑*/ private int r_blue = (int) (56/dn); /**白色進(jìn)度條高度*/ private int whiteProgressHeight = (int) (30/dn); /**藍(lán)色進(jìn)度條高度*/ private int blueProgressHeight = (int) (16/dn); /**文本顏色j*/ private String textColor="#46A3FF"; /**文本未激活顏色*/ private String textColorNotEnabled="#7E7E81"; // /**View 背景顏色*/ // private String bgColor="#e0000000"; /**文本框大小*/ private int textSize=(int) (32/dn); /**白色空心進(jìn)度條寬度*/ private int maxProgressWidth; /**半圓藍(lán)色進(jìn)度條寬度*/ private int half_blueWidth = (int) (12/dn); public String[] getTextArr() { return textArr; } public void setTextArr(String[] textArr) { this.textArr = textArr; count=textArr.length;; init(); this.post(new Runnable() { @Override public void run() { //讀取View寬度 viewWidth = NodeProgressBar.this.getWidth(); //讀取View高度 viewHeight = NodeProgressBar.this.getHeight(); // 進(jìn)度條寬度計(jì)算 maxProgressWidth = viewWidth - r_white-offX*2; //繪制 invalidate(); } }); } @SuppressWarnings("deprecation") public NodeProgressBar(Context context) { super(context); init(); } public NodeProgressBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } /**控制藍(lán)色進(jìn)度條*/ public void setProgressOnly(int i) { ratio = i / 100d; invalidate(); } /**以節(jié)點(diǎn)數(shù)來(lái)空值進(jìn)度條 至少大于1*/ public void setProgressByNode(final double d) { this.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub int progress; if(d==1) { progress=1; }else { progress= (int) ( (100d/((count-1)*1.0d))*(d-1)); } setProgressAndIndex(progress); } }); } /**控制藍(lán)色進(jìn)度條并且對(duì)節(jié)點(diǎn)染色*/ public void setProgressAndIndex(int i){ if(i==0){ index=0; ratio=0; invalidate(); return ; } //獲得相對(duì)進(jìn)度條長(zhǎng)度 int adbProgress = maxProgressWidth-(count-1)*r_white; //得到每一個(gè)節(jié)點(diǎn)所需進(jìn)度值 int k=100/(count-1); //計(jì)算當(dāng)前進(jìn)度需要染色的節(jié)點(diǎn)個(gè)數(shù) index=1+i/k; if(index!=count) { //獲得節(jié)點(diǎn)磁力比率 double wh=1.0d*(r_white/2)/(double)maxProgressWidth; //計(jì)算藍(lán)色進(jìn)度條和染色節(jié)點(diǎn)寬度 ratio=i%100==0?ratio=1:wh+wh*2*(index-1)+1.0d*((double)adbProgress/(double)maxProgressWidth)*(i/100d); }else { //設(shè)置進(jìn)度條為滿 ratio=1; } invalidate(); } /** * 初始化圖片資源,和基礎(chǔ)數(shù)值 * */ @SuppressWarnings("deprecation") private void init() { metrics=new DisplayMetrics(); ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics); Log.d("lxz", ""+metrics.density); dn=1*3/metrics.density; list_whitecircle=new ArrayList<BitmapDrawable>(); list_bluecircle=new ArrayList<BitmapDrawable>(); //根據(jù)節(jié)點(diǎn)個(gè)數(shù) 初始化空心圓和實(shí)心圓 for (int i = 0; i < count; i++) { BitmapDrawable drawable1 = new BitmapDrawable( BitmapFactory.decodeResource(getResources(), R.drawable.progress_white_circle)); list_whitecircle.add(drawable1); BitmapDrawable drawable2 = new BitmapDrawable( BitmapFactory.decodeResource(getResources(), R.drawable.progress_blue_circle)); list_bluecircle.add(drawable2); } //初始化藍(lán)色小半圓 db_blue_half_circle = new BitmapDrawable(BitmapFactory.decodeResource( getResources(), R.drawable.progress_blue_half_circle)); //初始化空心進(jìn)度條 db_empty = new BitmapDrawable(BitmapFactory.decodeResource( getResources(), R.drawable.progress_whtie_groove)); //初始化 db_blue = new BitmapDrawable(BitmapFactory.decodeResource( getResources(), R.drawable.progress_blue_groove)); //UI線程初始化數(shù)值 this.post(this); } @Override public void run() { //讀取View寬度 viewWidth = NodeProgressBar.this.getWidth(); //讀取View高度 viewHeight = NodeProgressBar.this.getHeight(); // 進(jìn)度條寬度計(jì)算 maxProgressWidth = viewWidth - r_white-offX*2; //繪制 invalidate(); } @Override public void draw(Canvas canvas) { // TODO Auto-generated method stub super.draw(canvas); //獲得X軸偏轉(zhuǎn)值 int offAbs_x=(int)((viewWidth-maxProgressWidth)/2.0d); //獲得X軸偏轉(zhuǎn)值 // canvas.drawColor(Color.parseColor(bgColor)); canvas.drawColor(Color.TRANSPARENT); //繪制空心進(jìn)度條 drawRect(canvas, db_empty, viewWidth / 2, r_white / 2+offY+offWhiteRect_y, maxProgressWidth,whiteProgressHeight); paint.setTextSize(textSize); paint.setFakeBoldText(true); //繪制白色空心園 for (int i = 0, j = list_whitecircle.size(); i < j; i++) { BitmapDrawable db_whitecircle = list_whitecircle.get(i); int x=maxProgressWidth / (count - 1)* i+offAbs_x; int y=r_white/2 + offWhiteCirle_y+offY; drawCircle(canvas, db_whitecircle,x, y, r_white); String str=textArr[i]; if(i<index) { paint.setColor(Color.parseColor(textColor)); }else { paint.setColor(Color.parseColor(textColorNotEnabled)); } float textWidht = paint.measureText(str); canvas.drawText(str, x-textWidht/2, y+offTextY, paint); } //繪制藍(lán)色進(jìn)度條 drawRect(canvas, db_blue, (int) ((maxProgressWidth * ratio) / 2)+offAbs_x , r_white / 2+offY, (int) (maxProgressWidth * ratio),blueProgressHeight); //繪制藍(lán)色小半圓 if (ratio > 0) { drawRect(canvas, db_blue_half_circle,(int) ((maxProgressWidth * ratio) / 2) + (int) (maxProgressWidth * ratio) / 2 + half_blueWidth / 2+offAbs_x, r_white / 2+offY, half_blueWidth, blueProgressHeight); } //繪制藍(lán)色圓 for (int i = 0, j = index; i < j; i++) { BitmapDrawable db_bluecircle = list_bluecircle.get(i); drawCircle(canvas, db_bluecircle, maxProgressWidth / (count - 1) * i+offAbs_x, r_white/2+offY, r_blue); } } /**傳統(tǒng)矩形坐標(biāo)方法*/ public void drawRect(Canvas canvas, Drawable d, int x, int y, int width, int height) { d.setBounds(x - width / 2, y - height / 2, x + width / 2, y + height / 2); d.draw(canvas); } /**傳統(tǒng)圓點(diǎn)坐標(biāo)計(jì)算方法*/ public void drawCircle(Canvas canvas, Drawable d, int x, int y, int r) { d.setBounds(x - r / 2, y - r / 2, x + r / 2, y + r / 2); d.draw(canvas); } /**繪制文字 傳統(tǒng)坐標(biāo)計(jì)算方法*/ public void drawText(Canvas canvas,Paint paint, String str, int x, int y, int w,int h) { canvas.drawText(str, x-w/2, y-h/2, x+w, y+h, paint); } public double getRatio() { return ratio; } public void setRatio(double ratio) { this.ratio = ratio; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義View實(shí)現(xiàn)漸變色進(jìn)度條
- Android自定義view實(shí)現(xiàn)水波進(jìn)度條控件
- Android自定義View實(shí)現(xiàn)加載進(jìn)度條效果
- Android 七種進(jìn)度條的樣式
- Android中實(shí)現(xiàn)Webview頂部帶進(jìn)度條的方法
- android自定義進(jìn)度條漸變色View的實(shí)例代碼
- Android文件下載進(jìn)度條的實(shí)現(xiàn)代碼
- android ListView和ProgressBar(進(jìn)度條控件)的使用方法
- Android中自定義進(jìn)度條詳解
- android實(shí)現(xiàn)快遞跟蹤進(jìn)度條
相關(guān)文章
Android編程實(shí)現(xiàn)ListView頭部ViewPager廣告輪詢(xún)圖效果
這篇文章主要介紹了Android編程實(shí)現(xiàn)ListView頭部ViewPager廣告輪詢(xún)圖效果,較為詳細(xì)的分析了自定義ListView實(shí)現(xiàn)ViewPager廣告圖輪詢(xún)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10詳解Android中常見(jiàn)的內(nèi)存優(yōu)化及內(nèi)存泄露場(chǎng)景
本文主要給大家介紹了Android中常見(jiàn)的內(nèi)存優(yōu)化及Android開(kāi)發(fā)中容易造成內(nèi)存泄露的場(chǎng)景,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08Android學(xué)習(xí)小結(jié)之Activity保存和恢復(fù)狀態(tài)
這篇文章主要介紹了Activity狀態(tài)保存和恢復(fù)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Android 清除SharedPreferences 產(chǎn)生的數(shù)據(jù)(實(shí)例代碼)
項(xiàng)目是要保存上次文件播放的位置,我使用SharedPreferences來(lái)保存,鍵值對(duì)分別是文件路徑和當(dāng)時(shí)播放的位置2013-11-11Android Bluetooth藍(lán)牙技術(shù)使用流程詳解
這篇文章主要介紹了Android Bluetooth藍(lán)牙技術(shù)使用流程詳解的相關(guān)資料,需要的朋友可以參考下2016-02-02