文字也带进度的进度条

实在不知道起什么名字好了,哈哈。看看效果先。

ezgif-4-8120c9098c.gif

其实时很简单的一个效果,但是我刚看到的时候,哇!好神奇,怎么实现的啊。经过了一番思考和对自定义控件的了解,然后给他搞了出来。下面我们来看看到底如何实现。

首先你要了解自定义View的绘制的api方法,了解了这些方法就很容易实现了。

  • Canvas(画布)

当你调用View#onDraw()中的canvas的时候你会发现真的好多方法,功能很强大。它可以完成弧线(arcs)、填充颜色(argb和color)、 Bitmap、圆(circle和oval)、点(point)、线(line)、矩形(Rect)、图片(Picture)、圆角矩形 (RoundRect)、文本(text)、顶点(Vertices)、路径(path)。今天在这里不会讲这些啦。主要讲能用到的今天项目的方法。主要是canvas.drawRect()和canvas.clicpRect。第一个不用多说了就是绘制一个矩形。而第二个也是顾名思义就是对矩形进行裁剪。那么怎么用呢,先来看一个例子。

mPaint = new Paint();
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.RED);
canvas.drawRect(new RectF(0, 0, 500, 100), mPaint);

他的样子时这样的


test1.png

然后再在添加一句代码

mPaint = new Paint();
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.RED);
canvas.clipRect(new RectF(0, 0, 200, 100));
canvas.drawRect(new RectF(0, 0, 500, 100), mPaint);

再看效果

test2.png

你会发现红条被裁剪了,他的宽度就是clicpRect()方法中的宽度。看到这里是不是一下子有了做进度条的思路呢。没错就是利用这个方法一步一步的进行裁剪就可以做出进度条的效果啦。进度条的效果有了,最神奇的字体进度是怎么回事呢?其实也是用这个方法啦。一个道理,只是需要一个简单的判断,判断进度何时到字体的位置,然后在进行裁剪。
撸代码:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //绘制背景
        drawBackgroud(canvas);
        //绘制进度
        drawProcess(canvas);
        //绘制文本
        drawText(canvas);
        //绘制进度文本
        drawProcessText(canvas);
    }

整体的代码逻辑就在这了。总共就分为这四个部分,利用canvas.drawRect()和canvas.clicpRect方法,加上一些有效性的判断就完全可以啦。具体的判断就很简单啦。我这里就直接伤代码了。

    private void drawBackgroud(Canvas canvas) {
        pgPaint.setColor(Color.GREEN);
        canvas.drawRoundRect(pgRect, radius, radius, pgPaint);
    }
    private void drawProcess(Canvas canvas) {
        processPaint.setColor(Color.GREEN);
        canvas.save(Canvas.CLIP_SAVE_FLAG);
        int right = (int) (mProcess / mMaxProcess * getMeasuredWidth());
        canvas.clipRect(pgRect.left, pgRect.top, right, pgRect.bottom);
        canvas.drawRoundRect(pgRect, radius, radius, processPaint);
        canvas.restore();
    }
    private void drawText(Canvas canvas) {
        processPaint.setColor(Color.GREEN);
        String text = getProcessText();
        processPaint.getTextBounds(text, 0, text.length(), textRect);
        processPaint.setTextSize(50);
        float tx = (getMeasuredWidth() - textRect.width()) / 2;
        float ty = (getMeasuredHeight() + textRect.height()) / 2;
        canvas.drawText(text, tx, ty, processPaint);
    }
    private void drawProcessText(Canvas canvas) {
        processPaint.setColor(Color.WHITE);
        //获取进度文本
        String text = getProcessText();
        canvas.save();
        //计算坐标,使文字居中显示
        float tx = (getMeasuredWidth() - textRect.width()) / 2;
        float ty = (getMeasuredHeight() + textRect.height()) / 2;
        //进度条走的进度比例
        int right = (int) (mProcess / mMaxProcess * getMeasuredWidth());
        //判断是否到了字体的位置。
        if(tx <= right){
            canvas.clipRect(textRect.left, textRect.top, right, textRect.right);
            canvas.drawText(text, tx, ty, processPaint);
        }
        canvas.restore();
    }

相信大家可以看懂里面的一些逻辑。就是在不断的进行裁剪实现进度的刷新。
mProcess是外部传进来的进度通过

    public void setProcess(int process){
        this.mProcess = process;
        postInvalidate();
    }

好啦,我这里就是将一个思路,这个例子还有很多完善的地方,大家可以自行完善就好。

给上Demo地址 这里

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

推荐阅读更多精彩内容