android 全局添加水印

34 阅读2分钟
package watermark

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.view.View
import com.orhanobut.logger.Logger

/**
 * 描述:水印视图自定义view
 * 作者:
 * 时间:
 * emil:
 * 备注:
 */
class WatermarkView(context: Context) : View(context) {
    private val paint = Paint()
    private val text = "水印文本"

    init {
        //paint.color = Color.parseColor("#4D79FF")
        paint.color = Color.RED  // 临时改为红色便于调试
        paint.textSize = 35f     // 增大字体
        paint.alpha = 100        // 提高透明度(0-255)

        // 添加更多画笔属性
        paint.isAntiAlias = true  // 抗锯齿
        paint.isDither = true     // 抖动处理

        // 设置不可点击,避免拦截触摸事件
        isClickable = false
        isFocusable = false
        // 调整透明度
        alpha = 0.3f  // 适度增加透明度
        visibility = View.VISIBLE

        // 强制启用绘图缓存(确保 View 会调用 onDraw 方法)
        setWillNotDraw(false)
        // 添加调试信息
        Logger.d("WatermarkView", "WatermarkView init called")
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        // 获取父容器的建议尺寸
        val width = MeasureSpec.getSize(widthMeasureSpec)
        val height = MeasureSpec.getSize(heightMeasureSpec)
        // 如果获取到的尺寸为0,尝试获取屏幕尺寸
        if (width == 0 || height == 0) {
            val displayMetrics = context.resources.displayMetrics
            setMeasuredDimension(displayMetrics.widthPixels, displayMetrics.heightPixels)
        } else {
            setMeasuredDimension(width, height)
        }
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        // 屏幕宽高
        Logger.d("WatermarkView-->onDraw width: $width, height: $height")
        // 绘制水印逻辑
        if (canvas != null && width > 0 && height > 0) {
            // 保存画布状态
            canvas.save()
            // 设置旋转中心点为视图中心
            val centerX = (width / 2).toFloat()
            val centerY = (height / 2).toFloat()

            // 旋转画布45度
            canvas.rotate(-25f, centerX, centerY)

            // 绘制多个水印形成平铺效果
            val spacing = 400 // 水印间距
            for (i in -2..width / spacing + 2) {
                for (j in -2..height / spacing + 2) {
                    val x = (i * spacing).toFloat()
                    val y = (j * spacing).toFloat()
                    // 添加边界检查确保在可视范围内绘制
                    if (x >= -spacing && x <= width + spacing && y >= -spacing && y <= height + spacing) {
                        canvas.drawText(text, x, y, paint)
                    }
                }
            }
            // 恢复画布状态
            canvas.restore()
        }
    }
}
package watermark

/**
 * 描述:全局添加水印
 * 作者:
 * 时间:
 * emil:
 * 备注:
 */
import android.app.Activity
import android.app.Application
import android.os.Bundle
import android.view.ViewGroup
import android.widget.FrameLayout

class WatermarkLifecycleHandler : Application.ActivityLifecycleCallbacks {
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        // 延迟添加确保 Activity 已完全初始化
        activity.window.decorView.post {
            addWatermark(activity)
        }
    }

    override fun onActivityStarted(activity: Activity) {}

    override fun onActivityResumed(activity: Activity) {}
    override fun onActivityPaused(activity: Activity) {}
    override fun onActivityStopped(activity: Activity) {}
    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
    override fun onActivityDestroyed(activity: Activity) {}

    private fun addWatermark(activity: Activity) {
        // 检查是否需要添加水印
        if (shouldAddWatermark(activity)) {

            // 实现水印添加逻辑
            val contentView = activity.findViewById<ViewGroup>(android.R.id.content)
            val watermarkView = WatermarkView(activity)
            // 使用简单的 MATCH_PARENT 参数
            val layoutParams = FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.MATCH_PARENT,
                FrameLayout.LayoutParams.MATCH_PARENT
            )
            // 添加到最上层确保可见
            contentView.addView(watermarkView, layoutParams)
        }
    }


    /**
     * 判断是否需要为当前Activity添加水印
     * @param activity 当前Activity实例
     * @return true-需要添加水印,false-不需要添加水印
     */
    private fun shouldAddWatermark(activity: Activity): Boolean {
        val activityName = activity.javaClass.simpleName
        // 定义不需要添加水印的页面列表
        val excludeActivities = listOf(
            "SplashAct",
            "HomeAct",
            "ShareBillAct"  // 后续可以继续添加
        )
        return !excludeActivities.contains(activityName)
    }
}
package cn.eeepay.v3agent

import android.util.Log
import cn.eeepay.enc.EncRSA
import cn.eeepay.lib_core.base.BaseApplication
import cn.eeepay.lib_core.utils.MMKVUtils
import cn.eeepay.lib_data.constants.EnvironmentDefConstant
import cn.eeepay.lib_data.constants.UrlConfigConstant
import cn.eeepay.net.Url
import watermark.WatermarkLifecycleHandler
import com.simple.spiderman.SpiderMan

class MainApp : BaseApplication() {

    override fun onCreate() {
        super.onCreate()
        // 初始化全局水印
        initWatermark()
    }
    private fun initWatermark() {
        // 注册Activity生命周期回调,在每个Activity创建时添加水印
        registerActivityLifecycleCallbacks(WatermarkLifecycleHandler())
    }
}