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

2023-04-12


标签背景图:


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



一、原理


我们看到的是自定义的文字以及文字角度被旋转了,但是文字在在自定义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无法完成宽度测量,里面都是固定值。所以一般宽度都是固定的,在使用过程中根据自己的需求,调整宽度和间距大小即可。


本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com