安卓自定义流程进度图控件

先上效果图:

如图,可实现设置:总流程数、已完进度程数、已完成颜色、各个流程点击事件,各个标题
github地址戳这里


使用方法

1.导入compile 'com.github.pavlospt:circleview:1.3'依赖包(因为用到了CircleView)
2.直接把下面两个文件一个java一个xml,复制粘贴进项目(代码放在了文章最后,暂时还没弄成开源库,有时间直接做成依赖包倒进去)

  • 在xml中写入ProcessImg控件
  • 在java文件中实例化ProcessImg对象
  • 根据需要调用几个方法
    1.对象.setColor( int color )
    设置已完成的进度的颜色,传入颜色的整型值
    2.对象.setProcess( int total , int process )
    设置总流程数和已完成进度数,第一个参数为总流程数(1~6,因为超过6个堆在一排很难看),第二个为已完成数,均为整型变量
    3.对象.setTitle( int position , String text )
    设置各流程的标题,第一个参数为标题对应的流程数(1~total),第二个参数为String格式标题文本
    **4.对象.setClick( int position , Click click ) **
    设置各流程的点击事件,第一个参数是点击的流程(1~total),第二个参数为点击后的回调方法。

源码

源码很简单,注释也比较清楚,应该能看懂

  • process_img.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/processImg_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="20dp">


    <LinearLayout
        android:id="@+id/process1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:visibility="gone">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">


            <View
                android:id="@+id/view1l"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>

            <com.github.pavlospt.CircleView
                android:id="@+id/circle1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                app:cv_backgroundColorValue="#00000000"
                app:cv_fillColor="#00000000"
                app:cv_strokeColorValue="#00000000"
                app:cv_subtitleText=""
                app:cv_titleColor="#fff"
                app:cv_titleSize="20sp"
                app:cv_titleText="1"/>

            <View
                android:id="@+id/view1r"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>
        </LinearLayout>

        <TextView
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="text1"
            android:textColor="#00000000"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/process2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:visibility="gone">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">


            <View
                android:id="@+id/view2l"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>

            <com.github.pavlospt.CircleView
                android:id="@+id/circle2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                app:cv_backgroundColorValue="#00000000"
                app:cv_fillColor="#00000000"
                app:cv_strokeColorValue="#00000000"
                app:cv_subtitleText=""
                app:cv_titleColor="#fff"
                app:cv_titleSize="20sp"
                app:cv_titleText="2"/>

            <View
                android:id="@+id/view2r"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>
        </LinearLayout>

        <TextView
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="text2"
            android:textColor="#00000000"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/process3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:visibility="gone">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">


            <View
                android:id="@+id/view3l"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>

            <com.github.pavlospt.CircleView
                android:id="@+id/circle3"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                app:cv_backgroundColorValue="#00000000"
                app:cv_fillColor="#00000000"
                app:cv_strokeColorValue="#00000000"
                app:cv_subtitleText=""
                app:cv_titleColor="#fff"
                app:cv_titleSize="20sp"
                app:cv_titleText="3"/>

            <View
                android:id="@+id/view3r"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>
        </LinearLayout>

        <TextView
            android:id="@+id/text3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="text3"
            android:textColor="#00000000"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/process4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:visibility="gone">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">


            <View
                android:id="@+id/view4l"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>

            <com.github.pavlospt.CircleView
                android:id="@+id/circle4"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                app:cv_backgroundColorValue="#00000000"
                app:cv_fillColor="#00000000"
                app:cv_strokeColorValue="#00000000"
                app:cv_subtitleText=""
                app:cv_titleColor="#fff"
                app:cv_titleSize="20sp"
                app:cv_titleText="4"/>

            <View
                android:id="@+id/view4r"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>
        </LinearLayout>

        <TextView
            android:id="@+id/text4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="text4"
            android:textColor="#00000000"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/process5"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:visibility="gone">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">


            <View
                android:id="@+id/view5l"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>

            <com.github.pavlospt.CircleView
                android:id="@+id/circle5"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                app:cv_backgroundColorValue="#00000000"
                app:cv_fillColor="#00000000"
                app:cv_strokeColorValue="#00000000"
                app:cv_subtitleText=""
                app:cv_titleColor="#fff"
                app:cv_titleSize="20sp"
                app:cv_titleText="5"/>

            <View
                android:id="@+id/view5r"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>
        </LinearLayout>

        <TextView
            android:id="@+id/text5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="text5"
            android:textColor="#00000000"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/process6"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:visibility="gone">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">


            <View
                android:id="@+id/view6l"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>

            <com.github.pavlospt.CircleView
                android:id="@+id/circle6"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                app:cv_backgroundColorValue="#00000000"
                app:cv_fillColor="#00000000"
                app:cv_strokeColorValue="#00000000"
                app:cv_subtitleText=""
                app:cv_titleColor="#fff"
                app:cv_titleSize="20sp"
                app:cv_titleText="6"/>

            <View
                android:id="@+id/view6r"
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_weight="2"
                android:background="#00000000"/>
        </LinearLayout>

        <TextView
            android:id="@+id/text6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="text6"
            android:textColor="#00000000"/>
    </LinearLayout>
</LinearLayout>

  • ProcessImg.java
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.github.pavlospt.CircleView;
import com.zxzhu.processtest.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by zxzhu on 2017/6/18.
 */

public class ProcessImg extends LinearLayout {
    public interface Click {
        void click();//点击事件回调
    }
    private String TAG = "ProcessImg";
    private CircleView circleView1, circleView2, circleView3, circleView4, circleView5, circleView6;
    private TextView textView1, textView2, textView3, textView4, textView5, textView6;
    //view代表流程连接线
    private View view1l, view1r, view2l, view2r, view3l, view3r, view4l, view4r, view5l, view5r, view6l, view6r;
    private LinearLayout process1, process2, process3, process4, process5, process6;
    private List<LinearLayout> layouts = new ArrayList<>();//用于控制流程个数的列表
    private List<View> views = new ArrayList<>();
    private List<TextView> texts = new ArrayList<>();
    private List<CircleView> circleViews = new ArrayList<>();
    private Context context;
    private int color = Color.parseColor("#E0E0E0");
    private int total = 0, process = 0;

    public ProcessImg(Context context) {
        super(context);
        this.context = context;
        initViews();
    }

    public ProcessImg(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        this.context = context;
        initViews();
    }

    private void initViews() {
        LayoutInflater.from(context).inflate(R.layout.process_img, this);
        circleView1 = (CircleView) findViewById(R.id.circle1);
        circleView2 = (CircleView) findViewById(R.id.circle2);
        circleView3 = (CircleView) findViewById(R.id.circle3);
        circleView4 = (CircleView) findViewById(R.id.circle4);
        circleView5 = (CircleView) findViewById(R.id.circle5);
        circleView6 = (CircleView) findViewById(R.id.circle6);
        process1 = (LinearLayout) findViewById(R.id.process1);
        process2 = (LinearLayout) findViewById(R.id.process2);
        process3 = (LinearLayout) findViewById(R.id.process3);
        process4 = (LinearLayout) findViewById(R.id.process4);
        process5 = (LinearLayout) findViewById(R.id.process5);
        process6 = (LinearLayout) findViewById(R.id.process6);
        textView1 = (TextView) findViewById(R.id.text1);
        textView2 = (TextView) findViewById(R.id.text2);
        textView3 = (TextView) findViewById(R.id.text3);
        textView4 = (TextView) findViewById(R.id.text4);
        textView5 = (TextView) findViewById(R.id.text5);
        textView6 = (TextView) findViewById(R.id.text6);
        view1l = findViewById(R.id.view1l);
        view1r = findViewById(R.id.view1r);
        view2l = findViewById(R.id.view2l);
        view2r = findViewById(R.id.view2r);
        view3l = findViewById(R.id.view3l);
        view3r = findViewById(R.id.view3r);
        view4l = findViewById(R.id.view4l);
        view4r = findViewById(R.id.view4r);
        view5l = findViewById(R.id.view5l);
        view5r = findViewById(R.id.view5r);
        view6l = findViewById(R.id.view6l);
        view6r = findViewById(R.id.view6r);
        circleViews.add(circleView1);
        circleViews.add(circleView2);
        circleViews.add(circleView3);
        circleViews.add(circleView4);
        circleViews.add(circleView5);
        circleViews.add(circleView6);
        layouts.add(process1);
        layouts.add(process2);
        layouts.add(process3);
        layouts.add(process4);
        layouts.add(process5);
        layouts.add(process6);
        texts.add(textView1);
        texts.add(textView2);
        texts.add(textView3);
        texts.add(textView4);
        texts.add(textView5);
        texts.add(textView6);
        views.add(view1l);
        views.add(view1r);
        views.add(view2l);
        views.add(view2r);
        views.add(view3l);
        views.add(view3r);
        views.add(view4l);
        views.add(view4r);
        views.add(view5l);
        views.add(view5r);
        views.add(view6l);
        views.add(view6r);
    }

    /**
     * 设置已完成流程颜色
     *
     * @param color
     */
    public void setColor(int color) {
        this.color = color;
        setProcess(total, process);
    }

    /**
     * 设置进度
     *
     * @param total   总共流程个数(不超过6)
     * @param process 当前进度
     */
    public void setProcess(int total, int process) {
        this.total = total;
        this.process = process;
        //使流程总数的view显示出来
        for (int i = 0; i < total; i++) {
            layouts.get(i).setVisibility(VISIBLE);
        }
        //  设置已完成进度的颜色
        for (int i = 0; i < circleViews.size(); i++) {
            if (i < process) {
                circleViews.get(i).setFillColor(color);
                circleViews.get(i).setBackgroundColor(color);
                circleViews.get(i).setStrokeColor(color);
                texts.get(i).setTextColor(color);

            } else {
                //未完成设置为灰色
                circleViews.get(i).setFillColor(Color.parseColor("#CCCCCC"));
                circleViews.get(i).setBackgroundColor(Color.parseColor("#CCCCCC"));
                texts.get(i).setTextColor(Color.parseColor("#CCCCCC"));
                circleViews.get(i).setStrokeColor(color);
                circleViews.get(i).setStrokeColor(Color.parseColor("#CCCCCC"));
            }
        }
        //设置流程连接线的颜色
        for (int i = 0; i < views.size(); i++) {
            if (i < process * 2) {
                views.get(i).setBackgroundColor(color);
            } else {
                views.get(i).setBackgroundColor(Color.parseColor("#CCCCCC"));
            }
        }
        views.get(0).setBackgroundColor(Color.parseColor("#00000000"));
        if (total != 0) {
            views.get(2 * total - 1).setBackgroundColor(Color.parseColor("#00000000"));
        }
    }

    /**
     * 设置各进度标题
     *
     * @param position
     * @param text
     */
    public void setTitle(int position, String text) {
        texts.get(position - 1).setText(text);
    }
}
     /**
     * 设置个流程的点击事件
     *
     * @param i
     * @param click 点击回调
     */
     public void setClick(int i, final Click click) {
        layouts.get(i - 1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                click.click();
            }
        });
    }

初学者,有bug,或者有更好的解决方案感谢指出!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,631评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,805评论 0 11
  • 朋友来黄河口时,其实已经错过了最美的季节。 初冬的湿地,早已没有了草木的葳蕤生长,就连久负盛名的芦花飞雪也早已看不...
    莹光灼华阅读 558评论 7 15
  • 1、手机QQ和微信的消息通知,为什么不能自定义分类。朋友消息、群消息、系统消息、订阅号、公众号各类消息错杂排列,不...
    missly117阅读 172评论 0 0