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

本文介绍了如何利用BitmapShader和StaticLayout将文字转换为Bitmap,并实现背景图的旋转和平铺效果。首先,通过StaticLayout将文字转换为布局对象,然后创建Bitmap并绘制到Canvas上。接着,利用BitmapShader的TileMode进行平铺,并通过Matrix设置旋转。最终将处理后的Bitmap应用到画笔上,绘制到矩形中,得到旋转和平铺的文字背景图。
摘要由CSDN通过智能技术生成

标签背景图:

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

一、原理

        我们看到的是自定义的文字以及文字角度被旋转了,但是文字在在自定义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);

最后的结果为:

三、核心代码


    /**
     * @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无法完成宽度测量,里面都是固定值。所以一般宽度都是固定的,在使用过程中根据自己的需求,调整宽度和间距大小即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值