标签背景图:
我们在一些文件或者一些资料中,经常看到背景被打上标签的图片,作为品牌或者防伪使用。
一、原理
我们看到的是自定义的文字以及文字角度被旋转了,但是文字在在自定义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);
}