亲们里面的线段颜色和节点图标都是可以自定义的。

在没给大家分享实例代码之前,先给大家展示下效果图:
main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rl_parent" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="#ffffff" tools:context=".MainActivity" xmlns:app="http://schemas.android.com/apk/res/com.demo.demomutiprogress"> <com.demo.demomutiprogress.MutiProgress android:id="@+id/mp_1" android:layout_width="match_parent" android:layout_height="100dp" app:nodesNum="4" app:currNodeState="1" app:currNodeNO="2" app:nodeRadius="10dp" app:processingLineColor="#7B68EE" app:unprogressingDrawable="@drawable/ic_round_ddd" app:progressingDrawable="@drawable/ic_completed" app:progresFailDrawable="@drawable/ic_error" app:progresSuccDrawable="@drawable/ic_checked"/> <com.demo.demomutiprogress.MutiProgress android:id="@+id/mp_2" android:layout_below="@+id/mp_1" android:layout_marginTop="20dp" android:layout_width="match_parent" android:layout_height="30dp" app:nodesNum="10" app:currNodeState="1" app:currNodeNO="6" app:nodeRadius="6dp" app:processingLineColor="#7B68EE" app:progressingDrawable="@drawable/ic_completed" app:unprogressingDrawable="@drawable/ic_round_ddd" app:progresFailDrawable="@drawable/ic_error" app:progresSuccDrawable="@drawable/ic_checked"/> <com.demo.demomutiprogress.MutiProgress android:id="@+id/mp_3" android:layout_below="@+id/mp_2" android:layout_marginTop="20dp" android:layout_width="match_parent" android:layout_height="50dp" app:nodesNum="15" app:currNodeState="0" app:currNodeNO="10" app:nodeRadius="4dp" app:processingLineColor="#FF00FF" app:progressingDrawable="@drawable/ic_completed" app:unprogressingDrawable="@drawable/ic_round_ddd" app:progresFailDrawable="@drawable/ic_error" app:progresSuccDrawable="@drawable/ic_checked"/> </RelativeLayout>
attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MutiProgress"> <attr name="nodesNum" format="integer"/> <!-- 节点数量 --> <attr name="nodeRadius" format="dimension"/> <attr name="progressingDrawable" format="reference"></attr> <attr name="unprogressingDrawable" format="reference" /> <!-- 未完成的节点图标 --> <attr name="progresFailDrawable" format="reference" /> <attr name="progresSuccDrawable" format="reference" /> <attr name="processingLineColor" format="color"></attr> <attr name="currNodeNO" format="integer"></attr> <!-- 当前所到达的节点编号 0开始计算--> <attr name="currNodeState" format="integer"></attr> <!-- 当前所到达的节点状态,0:失败 1:成功 --> </declare-styleable> </resources>
MutiProgress.java
package com.demo.demomutiprogress;
import java.util.ArrayList;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* 多节点进度条自定义视图
* @author huqiang
*
*/
public class MutiProgress extends View{
private int nodesNum ; //节点数量
private Drawable progressingDrawable; //进行中的图标
private Drawable unprogressingDrawable;
private Drawable progresFailDrawable; //失败的节点
private Drawable progresSuccDrawable; //成功的节点
private int nodeRadius; //节点的半径
private int processingLineColor; //进度条的颜色
// private int progressLineHeight; //进度条的高度
private int currNodeNO; //当前进行到的节点编号。从0开始计算
private int currNodeState; //当前进行到的节点编号所对应的状态 0:失败 1:成功
// private int textSize; //字体大小
Context mContext;
int mWidth,mHeight;
private Paint mPaint;
private Canvas mCanvas;
private Bitmap mBitmap; //mCanvas绘制在这上面
private ArrayList<Node> nodes;
private int DEFAULT_LINE_COLOR = Color.BLUE;
public MutiProgress(Context context) {
this(context,null);
}
public MutiProgress(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
public MutiProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
TypedArray mTypedArray = context.obtainStyledAttributes(attrs,R.styleable.MutiProgress);
nodesNum = mTypedArray.getInteger(R.styleable.MutiProgress_nodesNum, 1); //默认一个节点
nodeRadius = mTypedArray.getDimensionPixelSize(R.styleable.MutiProgress_nodeRadius, 10); //节点半径
progressingDrawable = mTypedArray.getDrawable(R.styleable.MutiProgress_progressingDrawable);
unprogressingDrawable = mTypedArray.getDrawable(R.styleable.MutiProgress_unprogressingDrawable);
progresFailDrawable = mTypedArray.getDrawable(R.styleable.MutiProgress_progresFailDrawable);
progresSuccDrawable = mTypedArray.getDrawable(R.styleable.MutiProgress_progresSuccDrawable);
processingLineColor = mTypedArray.getColor(R.styleable.MutiProgress_processingLineColor, DEFAULT_LINE_COLOR);
currNodeState = mTypedArray.getInt(R.styleable.MutiProgress_currNodeState, 1);
currNodeNO = mTypedArray.getInt(R.styleable.MutiProgress_currNodeNO, 1);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = getMeasuredWidth();
mHeight = getMeasuredHeight();
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
mPaint = new Paint();
mPaint.setColor(processingLineColor);
mPaint.setAntiAlias(true);
mPaint.setStrokeJoin(Paint.Join.ROUND); // 圆角
mPaint.setStrokeCap(Paint.Cap.ROUND); // 圆角
mCanvas = new Canvas(mBitmap);
nodes = new ArrayList<MutiProgress.Node>();
float nodeWidth = ((float)mWidth)/(nodesNum-1);
for(int i=0;i<nodesNum;i++)
{
Node node = new Node();
if(i==0)
node.mPoint = new Point(((int)nodeWidth*i),mHeight/2-nodeRadius);
else if(i==(nodesNum-1))
node.mPoint = new Point(((int)nodeWidth*i)-nodeRadius*2,mHeight/2-nodeRadius);
else
node.mPoint = new Point(((int)nodeWidth*i)-nodeRadius,mHeight/2-nodeRadius);
if(currNodeNO == i)
node.type = 1; //当前进度所到达的节点
else
node.type = 0; //已完成
nodes.add(node);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
DrawProgerss();
Log.v("ondraw", "mBitmap="+mBitmap);
if(mBitmap!=null)
{
canvas.drawBitmap(mBitmap, new Rect(0,0,mBitmap.getWidth(),mBitmap.getHeight()), new Rect(0,0,mBitmap.getWidth(),mBitmap.getHeight()), mPaint);
}
for(int i=0;i<nodes.size();i++)
{
Node node = nodes.get(i);
Log.v("ondraw", node.mPoint.x +";y="+node.mPoint.y);
if(i<currNodeNO) //已完成的进度节点
{
progressingDrawable.setBounds(node.mPoint.x, node.mPoint.y , node.mPoint.x + nodeRadius*2,node.mPoint.y + nodeRadius*2);
progressingDrawable.draw(canvas);
}
else if(i==currNodeNO) //当前所到达的进度节点(终点)
{
if(currNodeState == 1) //判断是成功还是失败 0 :失败 1:成功
{
progresSuccDrawable.setBounds(node.mPoint.x, node.mPoint.y , node.mPoint.x + nodeRadius*2,node.mPoint.y + nodeRadius*2);
progresSuccDrawable.draw(canvas);
}
else
{
progresFailDrawable.setBounds(node.mPoint.x, node.mPoint.y , node.mPoint.x + nodeRadius*2,node.mPoint.y + nodeRadius*2);
progresFailDrawable.draw(canvas);
}
}
else //未完成的进度节点
{
unprogressingDrawable.setBounds(node.mPoint.x, node.mPoint.y , node.mPoint.x + nodeRadius*2,node.mPoint.y + nodeRadius*2);
unprogressingDrawable.draw(canvas);
}
}
}
private void DrawProgerss()
{
//先画背景
Paint bgPaint = new Paint();
bgPaint.setColor(Color.parseColor("#f0f0f0"));
mCanvas.drawRect(0, 0, mWidth, mHeight, bgPaint);
//先画线段,线段的高度为nodeRadius/2
mPaint.setStrokeWidth(nodeRadius/2);
//前半截线段
// mCanvas.drawLine(nodeRadius, mHeight/2, mWidth-nodeRadius, mHeight/2, mPaint); //线段2端去掉nodeRadius
mCanvas.drawLine(nodeRadius, mHeight/2, nodes.get(currNodeNO).mPoint.x + nodeRadius, nodes.get(currNodeNO).mPoint.y + nodeRadius, mPaint); //线段2端去掉nodeRadius
//后半截线段
mPaint.setColor(Color.parseColor("#dddddd"));
mCanvas.drawLine(nodes.get(currNodeNO).mPoint.x +nodeRadius, nodes.get(currNodeNO).mPoint.y + nodeRadius, mWidth-nodeRadius, mHeight/2, mPaint); //线段2端去掉nodeRadius
}
class Node
{
Point mPoint;
int type; //0:已完成 1:当前到达的进度节点
}
}
源码下载点击此处
以上所述是小编给大家介绍的Android自定义多节点进度条显示的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android
# 多节点进度条
# 节点进度条
# Android 下载文件通知栏显示进度条功能的实例代码
# Android编程实现显示在标题上的进度条功能【附源码下载】
# Android实现标题上显示隐藏进度条效果
# android多线程断点下载-带进度条和百分比进度显示效果
# Android多线程+单线程+断点续传+进度条显示下载功能
# Android使用AsyncTask下载图片并显示进度条功能
# Android 进度条显示在标题栏的实现方法
# Android上传文件到服务端并显示进度条
# Android实现支持进度条显示的短信备份工具类
# android实现动态显示隐藏进度条
# 自定义
# 进度条
# 小编
# 未完成
# 都是
# 圆角
# 在这
# 在此
# 给大家
# 点击此处
# 所述
# 给我留言
# 感谢大家
# 先给
# 源码下载
# 没给
# 疑问请
# 有任何
# 所对应
# 画线
相关文章:
如何在景安云服务器上绑定域名并配置虚拟主机?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
制作电商网页,电商供应链怎么做?
制作旅游网站html,怎样注册旅游网站?
建站之星微信建站一键生成小程序+多端营销系统
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何做网站制作流程,*游戏网站怎么搭建?
深圳网站制作案例,网页的相关名词有哪些?
C++时间戳转换成日期时间的步骤和示例代码
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
常州企业建站如何选择最佳模板?
建站主机数据库如何配置才能提升网站性能?
建站之星代理商如何保障技术支持与售后服务?
如何获取PHP WAP自助建站系统源码?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过IIS搭建网站并配置访问权限?
建站之星在线版空间:自助建站+智能模板一键生成方案
太平洋网站制作公司,网络用语太平洋是什么意思?
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何做静态网页,sublimetext3.0制作静态网页?
如何零基础在云服务器搭建WordPress站点?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何解决VPS建站LNMP环境配置常见问题?
如何在西部数码注册域名并快速搭建网站?
如何选择高性价比服务器搭建个人网站?
如何将凡科建站内容保存为本地文件?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何快速搭建FTP站点实现文件共享?
网站专业制作公司有哪些,做一个公司网站要多少钱?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何快速生成凡客建站的专业级图册?
一键网站制作软件,义乌购一件代发流程?
如何在IIS7上新建站点并设置安全权限?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何快速搭建高效WAP手机网站吸引移动用户?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何在阿里云虚拟主机上快速搭建个人网站?
中山网站推广排名,中山信息港登录入口?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
行程制作网站有哪些,第三方机票电子行程单怎么开?
购物网站制作公司有哪些,哪个购物网站比较好?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
C++中引用和指针有什么区别?(代码说明)
如何在Windows虚拟主机上快速搭建网站?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何通过免费商城建站系统源码自定义网站主题与功能?
Thinkphp 中 distinct 的用法解析
*请认真填写需求信息,我们会在24小时内与您取得联系。