在Activity的 rootView上面添加 FrameLayout ,FrameLayout 上设置背景图片WaterMarkDrawable
(核心代码:水印的密度、边距、颜色、透明度 相关代码)
调用在此
这里是WaterMarkDrawable
public class WaterMarkDrawable extends Drawable {
public PaintmPaint;
/**
* 水印文本
*/
public StringmText;
/**
* 字体颜色,十六进制形式,例如:0xAEAEAEAE
*/
public int mTextColor;
/**
* 字体大小,单位为sp
*/
public float mTextSize;
/**
* 旋转角度
*/
public float mRotation;
/**
* 对角线等分数
*/
public int mUnit =10;
/**
* 设置透明度
*/
public int mAlpha =0x40;
public WaterMarkDrawable() {
mPaint =new Paint();
}
@Override
public void draw(@NonNull Canvas canvas) {
int width = getBounds().right;
int height = getBounds().bottom;
int diagonal = (int) Math.sqrt(width * width + height * height); // 对角线的长度
mPaint.setColor(mTextColor);
mPaint.setAlpha(mAlpha);
mPaint.setTextSize(spToPx(mTextSize));
mPaint.setAntiAlias(true);
float textWidth =mPaint.measureText(mText);
canvas.drawColor(0x00000000);
canvas.rotate(mRotation);
int index =0;
float fromX;
// 以对角线的长度来做高度,这样可以保证竖屏和横屏整个屏幕都能布满水印
for (int positionY = diagonal /mUnit; positionY <= diagonal; positionY += diagonal /mUnit) {
fromX = -width + (index++ %2) * textWidth; // 上下两行的X轴起始点不一样,错开显示
for (float positionX = fromX; positionX < width; positionX += textWidth *3) {
canvas.drawText(mText, positionX, positionY, mPaint);
}
}
canvas.save();
canvas.restore();
}
@Override
public void setAlpha(@IntRange(from =0, to =255)int alpha) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
/**
* Value of sp to value of px.
*
* @param spValue The value of sp.
* @return value of px
*/
public static int spToPx(float spValue) {
float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale +0.5f);
}
}
WaterMark 工具类
/**
* 水印
*/
public class WaterMarkUtils {
/**
* 水印文本
*/
private StringmText;
/**
* 字体颜色,十六进制形式,例如:0xAEAEAEAE
*/
private int mTextColor;
/**
* 字体大小,单位为sp
*/
private float mTextSize;
/**
* 旋转角度
*/
private float mRotation;
private static WaterMarkUtilssInstance;
private ViewGroupmViewGroup;
private int mUnit =10;
private int mAlpha =0x40;
private WaterMarkUtils() {
mText ="";
mTextColor =0xAEAEAEAE;
mTextSize =18;
mRotation = -25;
}
public static WaterMarkUtilsgetInstance() {
if (sInstance ==null) {
synchronized (WaterMarkUtils.class) {
sInstance =new WaterMarkUtils();
}
}
return sInstance;
}
/**
* 设置水印文本
*
* @param text 文本
* @return Watermark实例
*/
public WaterMarkUtilssetText(String text) {
mText = text;
return sInstance;
}
/**
* 设置字体颜色
*
* @param color 颜色,十六进制形式,例如:0xAEAEAEAE
* @return Watermark实例
*/
public WaterMarkUtilssetTextColor(int color) {
mTextColor = color;
return sInstance;
}
/**
* 设置字体大小
*
* @param size 大小,单位为sp
* @return Watermark实例
*/
public WaterMarkUtilssetTextSize(float size) {
mTextSize = size;
return sInstance;
}
/**
* 设置旋转角度
*
* @param degrees 度数
* @return Watermark实例
*/
public WaterMarkUtilssetRotation(float degrees) {
mRotation = degrees;
return sInstance;
}
/**
* 对角线等分数
*
* @param unit
* @return
*/
public WaterMarkUtilssetUnit(int unit) {
mUnit = unit;
return sInstance;
}
/**
* 设置透明度
*
* @param alpha
* @return
*/
public WaterMarkUtilssetAlpha(int alpha) {
mAlpha = alpha;
return sInstance;
}
/**
* 显示水印,铺满整个页面
*
* @param activity 活动
*/
public FrameLayoutshow(Activity activity) {
return show(activity, mText);
}
/**
* 显示水印,铺满整个页面
*
* @param activity 活动
* @param text 水印
* @return
*/
public FrameLayoutshow(Activity activity, String text) {
WaterMarkDrawable drawable =new WaterMarkDrawable();
drawable.mText = text;
drawable.mTextColor =mTextColor;
drawable.mTextSize =mTextSize;
drawable.mRotation =mRotation;
drawable.mUnit =mUnit;
drawable.mAlpha =mAlpha;
ViewGroup rootView = activity.findViewById(android.R.id.content);
FrameLayout layout =new FrameLayout(activity);
if (mViewGroup !=null) {
layout = (FrameLayout)mViewGroup;
}
layout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
layout.setBackground(drawable);
rootView.addView(layout);
return layout;
}
public void remove(Activity activity, FrameLayout layout) {
ViewGroup rootView = activity.findViewById(android.R.id.content);
rootView.removeView(layout);
}
}
勿喷:你猜的没错,我就是参考: