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
* 小林愛
* */
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)名稱*/
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ì)稱 偏移值*/
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)建一只新畫筆*/
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用文件存儲(chǔ)數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了Android用文件存儲(chǔ)數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)時(shí)間倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android Studio實(shí)現(xiàn)簡(jiǎn)易進(jìn)制轉(zhuǎn)換計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)易進(jìn)制轉(zhuǎn)換計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
android開發(fā)教程之文本框加滾動(dòng)條scrollview
EditText與TextView加上滾動(dòng)條其實(shí)很簡(jiǎn)單,只需要在文本輸入框或者文本顯示框上面加上滾動(dòng)條控件即可2014-02-02
深入理解Android熱修復(fù)技術(shù)原理之代碼熱修復(fù)技術(shù)
在各種 Android 熱修復(fù)方案中,Andfix的即時(shí)生效令人印象深刻,它稍顯另類, 并不需要重新啟動(dòng),而是在加載補(bǔ)丁后直接對(duì)方法進(jìn)行替換就可以完成修復(fù),然而它的使用限制也遭遇到更多的質(zhì)疑2021-06-06
Android_UI 仿QQ側(cè)滑菜單效果的實(shí)現(xiàn)
相信大家對(duì)QQ側(cè)滑菜單的效果已經(jīng)不陌生了吧,側(cè)滑進(jìn)入個(gè)人頭像一側(cè),進(jìn)行對(duì)頭像的更改,我的收藏,QQ錢包,我的文件等一系列的操作,下面小編給大家分享Android_UI 仿QQ側(cè)滑菜單效果的實(shí)現(xiàn),一起看看吧2017-04-04
簡(jiǎn)單實(shí)用的Android studio 調(diào)試技巧
這篇文章主要介紹了簡(jiǎn)單實(shí)用的Android studio 調(diào)試技巧的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
百度語(yǔ)音識(shí)別(Baidu Voice) Android studio版本詳解
這篇文章主要介紹了百度語(yǔ)音識(shí)別(Baidu Voice) Android studio版本詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09

