自定义View之审核进度展示

失踪人口回归,好好整理一下简书,写几篇文章,效果图如下:

image

思路

这个自定义view实现和我以前一篇文章大同小异,只不过这里的圆形背景用图片画出来了,这里的重点还是确定起始的坐标点,这里我是以 图片的宽高为核心,确立坐标的。 startX =av_imageWidth+av_imageWidth/2;这里我让x起点离左边界 一个半左右的图片宽度的距离 。

代码

public class AuditprogressView extends View {
    private Context mcontext;
    private float av_imageWidth; // 图片宽高
    private float av_linehight; // 线的高度
    private int av_lineColor; // 线的颜色
    private float av_Textsize; // 进度文字展示
    private float av_timeTextsize; //时间 文字
    private  int av_Textcolor; // 进度文字的颜色
    private  int av_timeTextcolor; // 时间文字的颜色
    private  int progressCount = 4; // 进度个数
    private Paint paint ; // 画笔
    //  确定绘制的图片
    private Bitmap audit_drawBitmap;
    /*
       * view的高度
       */
    private int height;
    private int width;

    /**
     * 第一个图的坐标
     */
    private float startX;
    private float startY;

    private RectF imageRectF; // 图片绘制的区域


    private ArrayList<String>  textlist ; // 进度文字list

    private ArrayList<String>  ttextlist  ; // 时间文字list

    private int progress = 2; //  当前进度

    private  boolean isProgress;// 当前进度是成功还是失败

    public AuditprogressView(Context context) {
        super(context);
    }

    public AuditprogressView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mcontext =context;
        getAtt(attrs);
        initPaint();
    }

    public AuditprogressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void getAtt(AttributeSet attrs) {
        TypedArray typedArray = mcontext.obtainStyledAttributes(attrs, R.styleable.AuditprogressView);
        progressCount = typedArray.getInt(R.styleable.AuditprogressView_av_progressCount, progressCount);
        av_Textcolor = typedArray.getColor(R.styleable.AuditprogressView_av_Textcolor,  Color.parseColor("#df0781"));
        av_lineColor = typedArray.getColor(R.styleable.AuditprogressView_av_lineColor,  Color.parseColor("#df0781"));
        av_timeTextcolor =typedArray.getColor(R.styleable.AuditprogressView_av_timeTextcolor,  Color.parseColor("#df0781"));
        av_imageWidth = typedArray.getDimension(R.styleable.AuditprogressView_av_imageWidth,100);
        av_linehight = typedArray.getDimension(R.styleable.AuditprogressView_av_linehight,10);
        av_Textsize = typedArray.getDimension(R.styleable.AuditprogressView_av_Textsize,10);
        av_timeTextsize = typedArray.getDimension(R.styleable.AuditprogressView_av_timeTextsize,10);
        typedArray.recycle();
    }
    /**
     * 初始化画笔
     */
    private void initPaint() {
        imageRectF = new RectF();
        paint = new Paint();
        // 抗锯齿
        paint.setAntiAlias(true);
//        // 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
        paint.setDither(true);
//        // 空心
//        paint.setStyle(Paint.Style.STROKE);
        // 文字居中
        paint.setTextAlign(Paint.Align.CENTER);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w;
        height = h;
    }




    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        startX =av_imageWidth+av_imageWidth/2;
        startY = av_imageWidth+av_imageWidth/2;
        paint.setTextSize(av_Textsize);
        if (ttextlist.size()>0&&textlist.size()>0){
            drawLine(canvas);
            drawImage(canvas);
            drawText(canvas);
            drawTimeText(canvas);
        }


    }
    // 画文本
    private void drawTimeText(Canvas canvas) {
        paint.setColor(av_Textcolor);
        for (int i = 0; i < progressCount; i++) {
            canvas.drawText(ttextlist.get(i),startX + i * (width- 2*(av_imageWidth+av_imageWidth/2))/(progressCount-1),3*startY, paint);
        }
    }

    // 画时间文本
    private void drawText(Canvas canvas) {
        paint.setColor(av_timeTextcolor);
        for (int i = 0; i < progressCount; i++) {
            canvas.drawText(textlist.get(i),startX + i * (width- 2*(av_imageWidth+av_imageWidth/2))/(progressCount-1),2*startY, paint);
        }
    }



    // 画图片
    private void drawImage(Canvas canvas) {
        for (int i = 0; i < progressCount; i++) {
            if (i<=progress-1){
                audit_drawBitmap =  BitmapFactory.decodeResource(getResources(), R.drawable.finsh);
                if (i ==progress-1&& !isProgress){
                    audit_drawBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.defeated);
                }
//
            }else {
                audit_drawBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.no_finsh);
//
            }
            // 绘制图片
//            canvas.drawBitmap(audit_drawBitmap,startX -av_imageWidth/2+i * (width- 2*(av_imageWidth+av_imageWidth/2))/(progressCount-1), startY-av_imageWidth/2, paint);

            imageRectF.set((float)(startX -av_imageWidth/2+i * (width- 2*(av_imageWidth+av_imageWidth/2))/(progressCount-1)),(float)(startY-av_imageWidth/2),(float)(startX +av_imageWidth/2+i * (width- 2*(av_imageWidth+av_imageWidth/2))/(progressCount-1)),(float)(startY+av_imageWidth/2));
            canvas.drawBitmap(audit_drawBitmap, null, imageRectF, null);
        }
    }

    // 画线
    private void drawLine(Canvas canvas) {
        for (int i = 0; i < progressCount-1; i++) {
            if (i<=progress-2){
                paint.setColor(av_lineColor);
            }else {
                paint.setColor(Color.BLACK);;
            }
            canvas.drawLine(2*av_imageWidth/3+startX + i * (width- 2*(av_imageWidth+av_imageWidth/2))/(progressCount-1),startY,startX-2*av_imageWidth/3 + (i+1) * (width- 2*(av_imageWidth+av_imageWidth/2))/(progressCount-1),startY,paint);

        }
    }

    public  void  setDate(ArrayList<String> mtextlist,ArrayList<String> mttextlist ,int mProgress,boolean isprogress){
        textlist = mtextlist;
        ttextlist = mttextlist;
        progress = mProgress;
        isProgress = isprogress;
        invalidate();
    }

}

attrs文件

 <declare-styleable name="AuditprogressView">
        <attr name="av_imageWidth" format="dimension" />
        <attr name="av_progressCount" format="integer" />
        <attr name="av_lineWidth" format="dimension" />
        <attr name="av_linehight" format="dimension" />
        <attr name="av_lineColor" format="color" />
        <attr name="av_Textsize" format="dimension"></attr>
        <attr name="av_timeTextsize" format="dimension"></attr>
        <attr name="av_Textcolor" format="color"></attr>
        <attr name="av_timeTextcolor" format="color"></attr>
    </declare-styleable>

Activity运用

final ArrayList<String > textlist = new ArrayList<>();
        textlist.add("提交成功");
        textlist.add("提交成功");
        textlist.add("提交成功");
        textlist.add("提交成功");
        textlist.add("提交成功");
        final ArrayList<String> timelist = new ArrayList<>();
        timelist.add("12-18 11:20");
        timelist.add("12-19 11:20");
        timelist.add("12-20 11:20");
        timelist.add("12-21 11:20");
        timelist.add("12-21 11:20");
        av.setDate(textlist,timelist,3,true);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                av.setDate(textlist,timelist, (int) (Math.random() * 6),true);
            }
        });

项目地址:
csdn:http://download.csdn.net/download/qq_38367802/10172775
github:https://github.com/liuzhenhang/myview

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

推荐阅读更多精彩内容