Android 繪制背景標(biāo)簽圖片,文件防偽背景圖詳解
標(biāo)簽背景圖:
我們?cè)谝恍┪募蛘咭恍┵Y料中,經(jīng)??吹奖尘氨淮蛏蠘?biāo)簽的圖片,作為品牌或者防偽使用。

一、原理
我們看到的是自定義的文字以及文字角度被旋轉(zhuǎn)了,但是文字在在自定義view的時(shí)候,無法通過paint來完成重復(fù)繪制,如果手動(dòng)計(jì)算,那會(huì)很耗時(shí)。這是,我們想到BitmapShader,BitmapShader提供了在X和Y軸的模式,平鋪模式:TileMode,這個(gè)著色器可以自動(dòng)完成模式計(jì)算。
剩余的就是如何將字符串變成Bitmap。
String類型的想要變成bitmap,最快捷的方式就是通過TextView,把textView轉(zhuǎn)換成bitmap,但是由于textview必須添加到window里才能完成轉(zhuǎn)換。這個(gè)時(shí)候如何將text轉(zhuǎn)換成bitmap呢?
我們可以借助StaticLayout。
public StaticLayout(CharSequence source, TextPaint paint, int width,Alignment align, float spacingmult, float spacingadd,boolean includepad)
source:要展示的字符串
paint:畫筆
width:內(nèi)容的寬
align:對(duì)其方式
spacingmult:間距,倍數(shù)
spacingadd:添加的間距
includepad:是否包括pad
StaticLayout layout = new StaticLayout(text, textPaint, 450,
Layout.Alignment.ALIGN_CENTER, 1.5f, 0.0f, true);
將text轉(zhuǎn)換成bitmap:
1.借助靜態(tài)布局StaticLayout,將文字轉(zhuǎn)換成布局對(duì)象
2.繪制一張空的bitmap對(duì)象
Bitmap bitmap = Bitmap.createBitmap(layout.getWidth() + spaceValue,
layout.getHeight() + spaceValue, Bitmap.Config.ARGB_8888);
3.將bimap轉(zhuǎn)成一個(gè)新的畫布
Canvas canvas = new Canvas(bitmap);
canvas.translate(10, 10);
4.將新畫布繪制到靜態(tài)布局里,這時(shí)候,bitmap已變成當(dāng)前布局中的對(duì)象,這樣我們就得到了text的bitmap。
5.拿到bitmap,我們還要對(duì)bitmap進(jìn)行旋轉(zhuǎn)和平鋪模式進(jìn)行處理,這時(shí)候我們需要借助與BitmapShader。
BitmapShader shader=new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
創(chuàng)建一個(gè)著色器,色值填充樣式為重復(fù)在x和y軸。
這時(shí)還缺少對(duì)bitmap進(jìn)行旋轉(zhuǎn),由于BitmapShader提供了setLocalMatrix方法,我們可以通過新的矩陣來完成旋轉(zhuǎn)
Matrix matrix=new Matrix();
matrix.setRotate(-45);
shader.setLocalMatrix(matrix);
6.將做色器添加到畫筆中
paint.setShader(shader);
7.繪制一個(gè)矩形控件即可。這時(shí)候畫筆中已經(jīng)設(shè)置好著色器,
canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),paint);
最后的結(jié)果為:

三、核心代碼
/**
* @param textSize 字體大小
* @param text 需要展示的內(nèi)容
* */
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;//控制各個(gè)間距的大小
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無法完成寬度測(cè)量,里面都是固定值。所以一般寬度都是固定的,在使用過程中根據(jù)自己的需求,調(diào)整寬度和間距大小即可。
本文僅代表作者觀點(diǎn),版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請(qǐng)?jiān)谖闹凶⒚鱽碓醇白髡呙帧?/p>
免責(zé)聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)及時(shí)與我們聯(lián)系進(jìn)行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com






