文字反色效果的实现

先看效果:



这种反色的效果实现起来说简单也简单说难也难。若是不借助一些手段,就是手动的控制染色,那就比较复杂了,若是借助一些现有的接口,实现起来只需几行代码而已。

我们这里就借助于自定义view中非常强大的PorterDuffXfermode类来实现,首先贴上一张很著名的图,这个类的所有玄机也就包括在这张图中:



对Xfermode还不了解的朋友建议先去熟悉一下,这里就不展开来讲了,这一块的内容足够写一篇长文了。

我们这里的文字反色效果就是利用的SrcIn模式,首先文字作为Dst图层,然后随着进度条的变化绘制一个白色的和进度条重合的图层作为Src,二者相交后,显示文字的轮廓和Src层的色彩,自然使文字反色了。是不是很简单?直接来看代码,这里只贴出绘制文字部分代码:

    private void drawText(Canvas canvas) {
        String str = "ABCDEFGH";
        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas textCanvas = new Canvas(bitmap);

        //绘制文字,红色
        textCanvas.drawText(str,w/2-textPaint.measureText(str)/2,textY,textPaint);
        //设置模式,SrcIn
        textPaint.setXfermode(mode);
        //设置背景层,白色
        textPaint.setColor(Color.WHITE);
        //绘制和进度条一样的图层,白色
        textCanvas.drawRoundRect(new RectF(bgRect.left,bgRect.top,bgRect.right*progress,bgRect.bottom), radius, radius, textPaint);
        //绘制到画布上
        canvas.drawBitmap(bitmap, 0, 0, null);
        //恢复画笔
        textPaint.setXfermode(null);
        textPaint.setColor(Color.parseColor("#FE557D"));
    }

实际上还有一处利用了Xfermode,就是绘制进度条时,在进度条较短时,由于是圆角矩形,为了避免溢出边框也利用了Xfermode,详见完整代码。

你可能感兴趣的:(文字反色效果的实现)