import android.app.Activity; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.annotation.Nullable; /** * 水印 */ public class Watermark { /** * 水印文本 */ private String mText; /** * 字体颜色(argb),十六进制形式,例如:0xAEAEAEAE */ private int mTextColor; /** * 字体大小,单位为sp */ private float mTextSize; /** * 旋转角度 */ private float mRotation; private static Watermark sInstance; private Watermark() { mText = ""; mTextColor = 0xAECECECE; mTextSize = 18; mRotation = -45; } public static Watermark getInstance() { if (sInstance == null) { synchronized (Watermark.class) { sInstance = new Watermark(); } } return sInstance; } /** * 设置水印文本 * * @param text 文本 * @return Watermark实例 */ public Watermark setText(String text) { mText = text; return sInstance; } /** * 设置字体颜色 * * @param color 颜色,十六进制形式,例如:0xAEAEAEAE * @return Watermark实例 */ public Watermark setTextColor(int color) { mTextColor = color; return sInstance; } /** * 设置字体大小 * * @param size 大小,单位为sp * @return Watermark实例 */ public Watermark setTextSize(float size) { mTextSize = size; return sInstance; } /** * 设置旋转角度 * * @param degrees 度数 * @return Watermark实例 */ public Watermark setRotation(float degrees) { mRotation = degrees; return sInstance; } /** * 显示水印,铺满整个页面 * * @param activity 活动 */ public void show(Activity activity) { show(activity, mText); } /** * 显示水印,铺满整个页面 * * @param activity 活动 * @param text 水印 */ public void show(Activity activity, String text) { if (activity == null || TextUtils.isEmpty(text)) { return; } WatermarkDrawable drawable = new WatermarkDrawable(); drawable.mText = text; drawable.mTextColor = mTextColor; drawable.mTextSize = mTextSize; drawable.mRotation = mRotation; ViewGroup rootView = activity.findViewById(android.R.id.content); FrameLayout layout = new FrameLayout(activity); layout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout.setBackground(drawable); rootView.addView(layout); } /** * 显示水印,只给指定的View设置水印背景 * @param view * @param text */ public void show(View view, String text) { if (view == null || TextUtils.isEmpty(text)) { return; } WatermarkDrawable drawable = build(text); view.setBackground(drawable); } private WatermarkDrawable build(String text){ WatermarkDrawable drawable = new WatermarkDrawable(); drawable.mText = text; drawable.mTextColor = mTextColor; drawable.mTextSize = mTextSize; drawable.mRotation = mRotation; return drawable; } public FrameLayout buildWaterMarkFrame(Activity activity, String text) { FrameLayout layout = new FrameLayout(activity); layout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout.setBackground(build(text)); return layout; } private class WatermarkDrawable extends Drawable { private Paint mPaint; /** * 水印文本 */ private String mText; /** * 字体颜色,十六进制形式,例如:0xAEAEAEAE */ private int mTextColor; /** * 字体大小,单位为sp */ private float mTextSize; /** * 旋转角度 */ private float mRotation; private 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.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 / 7; positionY <= diagonal; positionY += diagonal / 7) { 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); } }