标签背景图:

我们在一些文件或者一些资料中,经常看到背景被打上标签的图片,作为品牌或者防伪使用。

Android 绘制背景标签图片,文件防伪背景图详解_字符串

一、原理

        我们看到的是自定义的文字以及文字角度被旋转了,但是文字在在自定义view的时候,无法通过paint来完成重复绘制,如果手动计算,那会很耗时。这是,我们想到BitmapShader,BitmapShader提供了在X和Y轴的模式,平铺模式:TileMode,这个着色器可以自动完成模式计算。

剩余的就是如何将字符串变成Bitmap。

String类型的想要变成bitmap,最快捷的方式就是通过TextView,把textView转换成bitmap,但是由于textview必须添加到window里才能完成转换。这个时候如何将text转换成bitmap呢?

我们可以借助StaticLayout。


public StaticLayout(CharSequence source, TextPaint paint, int width,Alignment align, float spacingmult, float spacingadd,boolean includepad)


source:要展示的字符串

paint:画笔

width:内容的宽

align:对其方式

spacingmult:间距,倍数

spacingadd:添加的间距

includepad:是否包括pad


StaticLayout layout = new StaticLayout(text, textPaint, 450,
        Layout.Alignment.ALIGN_CENTER, 1.5f, 0.0f, true);


将text转换成bitmap:

1.借助静态布局StaticLayout,将文字转换成布局对象

2.绘制一张空的bitmap对象


Bitmap bitmap = Bitmap.createBitmap(layout.getWidth() + spaceValue,
        layout.getHeight() + spaceValue, Bitmap.Config.ARGB_8888);

3.将bimap转成一个新的画布


Canvas canvas = new Canvas(bitmap);
canvas.translate(10, 10);


4.将新画布绘制到静态布局里,这时候,bitmap已变成当前布局中的对象,这样我们就得到了text的bitmap。

5.拿到bitmap,我们还要对bitmap进行旋转和平铺模式进行处理,这时候我们需要借助与BitmapShader。

BitmapShader shader=new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);


创建一个着色器,色值填充样式为重复在x和y轴。

这时还缺少对bitmap进行旋转,由于BitmapShader提供了setLocalMatrix方法,我们可以通过新的矩阵来完成旋转

Matrix matrix=new Matrix();
matrix.setRotate(-45);
shader.setLocalMatrix(matrix);

6.将做色器添加到画笔中


paint.setShader(shader);


7.绘制一个矩形控件即可。这时候画笔中已经设置好着色器,


canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);


最后的结果为:

Android 绘制背景标签图片,文件防伪背景图详解_ci_02

三、核心代码

/**
     * @param textSize 字体大小
     * @param text 需要展示的内容
     * */

    public static Bitmap textAsBitmap(String text, float textSize) {

        TextPaint textPaint = new TextPaint();

        textPaint.setColor(Color.DKGRAY);
        textPaint.setAntiAlias(true);
        textPaint.setTextSize(textSize);
        textPaint.setAlpha(100);//透明度

        int spaceValue=150;//控制各个间距的大小

        StaticLayout layout = new StaticLayout(text, textPaint, 400,
                Layout.Alignment.ALIGN_NORMAL, 1.5f, 0.0f, true);
        Bitmap bitmap = Bitmap.createBitmap(layout.getWidth() + spaceValue,
                layout.getHeight() + spaceValue, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.translate(10, 10);
        layout.draw(canvas);
        return bitmap;
    }
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (paint == null) {
            paint = new Paint();
        }

        Bitmap bitmap=textAsBitmap(showName,60);




        BitmapShader shader=new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        Matrix matrix=new Matrix();
        matrix.setRotate(-45);
        shader.setLocalMatrix(matrix);
        paint.setShader(shader);
        canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);


    }

注意:由于这些text无法完成宽度测量,里面都是固定值。所以一般宽度都是固定的,在使用过程中根据自己的需求,调整宽度和间距大小即可。