Android 水印效果

Android 水印效果

本文主要介绍下android 中水印的实现效果.

实现的方式有多种,就不一一赘述了, 本文就是通过自定义drawable来实现水印.

不多说,直接上代码吧:

java 复制代码
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;

public class WatermarkDrawable extends Drawable {
    private String watermarkText;
    private Paint paint;
    private boolean isOne;
    private int numX, numY;
    private int mWidth, mHeight, mOffSet, textWidth, textHeight;
    private Context mContext;

    public WatermarkDrawable(Context context, String text, boolean isOne) {
        watermarkText = text;
        mContext = context;
        this.isOne = isOne;
        paint = new Paint();
        paint.setColor(Color.GRAY);
        paint.setTextSize(50);
        paint.setAlpha(100);
        textWidth = (int) paint.measureText(watermarkText);
        Paint.FontMetrics fontMetrics = paint.getFontMetrics();
        textHeight = (int) (fontMetrics.descent - fontMetrics.ascent);
        Resources resources = mContext.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        mWidth = dm.widthPixels;
        mHeight = dm.heightPixels;
        mOffSet = ((mHeight - mWidth) >> 1);

        int max = Math.max(mWidth, mHeight);
        numX = max / (textWidth + 50) + 2;
        numY = max / (textHeight + 100) + 2;
    }

    @Override
    public void draw(Canvas canvas) {
        if (isOne) {
            drawOneWaterMark(canvas);
        } else {
            drawFullWaterMark(canvas);
        }
    }

    private void drawOneWaterMark(Canvas canvas) {
        int width = getBounds().width();
        int height = getBounds().height();

        float textWidth = paint.measureText(watermarkText);
        float x = (width - textWidth) / 2;
        float y = height / 2;

        canvas.drawText(watermarkText, x, y, paint);
    }

    private void drawFullWaterMark(Canvas canvas) {
        for (int i = 0; i < numY; i++) {
            int yy = (100 >> 1) + (100 + textHeight) * i;
            for (int j = 0; j < numX; j++) {
                float xx = (i % 2) * (50 + textWidth) / 2 + j * (50 + textWidth);
                canvas.drawText(watermarkText, xx, yy, paint);
            }
        }
    }


    @Override
    public void setAlpha(int alpha) {
        paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        paint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

这里只是简单实现下单个水印以及全局多个水印的效果, 后续水印的效果:如 旋转角度,水印的多少,水印文案的限制在继续优化吧.

设置水印的方式也很简单:

java 复制代码
  WatermarkDrawable watermarkDrawable = new WatermarkDrawable(this,"测试", false);

获取acitvity的根布局, 设置背景drawable即可.

我们可以通过调用setForeground方法, 让水印在整个页面的前台,从而不被页面中的组件遮挡.

效果如下:

相关推荐
我命由我123451 小时前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio
A富得流油的咸鸭蛋1 小时前
安卓鸿蒙面试
android·面试·harmonyos
Coffeeee2 小时前
AGP9.0的主要变更项,给Gradle来一次大变样
android·前端·gradle
小孔龙2 小时前
Android GPU 渲染管线:一帧画面如何走上屏幕
android·性能优化·gpu
恋猫de小郭2 小时前
KotlinLLM 开源 ,一个可以在运行时自己生成永久 Kotlin 代码的 Agent 库
android·前端·人工智能
游戏开发爱好者82 小时前
iOS应用加固方案全解析:源码加固与IPA在线加固对比
android·macos·ios·小程序·uni-app·cocoa·iphone
大鹏说大话3 小时前
PHP 异步处理方案:队列使用场景与 RabbitMQ 实操
android
molihuan3 小时前
最新 Paddle-Lite Android平台编译
android·ocr·paddle·推理·端侧·paddle lite
小肝一下4 小时前
多态(上)
android·开发语言·c++·vscode·多态·面向对象·伊蕾娜
三少爷的鞋4 小时前
Android 面试系列:Retrofit 的 suspend 是如何实现的?
android