Android生成水印

图一:假设屏幕是蓝色的正方形,水印背景红色的正方形,旋转45度得到灰色的正方形


图二:平移灰色的正方形水印--》绿色的正方形


图三:旋转绿色的正方形水印,得到黑色的正方形水印


图四;平移黑色的正方形水印 最终得到了黄色的正方形水印(图一中红色的正方形水印)


图五:效果图(可自定义角度)


图一到图四是我反推的一个过程,因为要去旋转水印画布,所以需要找到那个最大的边,也就是我们屏幕对角线的长度,以这个长度为边长画一个正方形,就是我们想要的旋转画布边长。

算出边长我们画出图一中红色的正方形,向上平移到黑色正方形的位置,无论画布如何旋转,我们蓝色的屏幕都不会留白。

代码:


package com.material.myview

import android.content.Context

import android.graphics.*

import android.graphics.drawable.Drawable

import kotlin.math.sqrt

/**

* @author Che

* @description: 水印控件

* @date :2021/11/10 17:31

*/

class WaterMarkView(

private val context: Context,

    private val text: String,

    private val angle: Int,

    private val fontSize: Int

) : Drawable() {

private var mPaint: Paint = Paint()

private var bitmapWaterMark: Bitmap? =null

    private var markWaterCanvas: Canvas? =null

    //文字得宽高

    private var textH: Float =0F

    private var textW: Float =0F

    //图片得宽高

    private var bitmapW: Float =0F

    private var bitmapH: Float =0F

    //水印得位置

    private var watermarkW: Int =0

    private var watermarkH: Int =0

    init {

mPaint.style = Paint.Style.FILL_AND_STROKE

        mPaint.color = Color.parseColor("#AB78B1")

}

override fun draw(canvas: Canvas) {

mPaint.textSize = sp2px(context, fontSize.toFloat()).toFloat()

//文字宽高

        textW =mPaint.measureText(text)

textH =mPaint.fontMetrics.bottom -mPaint.fontMetrics.top

        //底层图片宽高

        bitmapW =bounds.width().toFloat()

bitmapH =bounds.height().toFloat()

//算出水印的宽高

        val sqr =sqrt((bitmapW *bitmapW +bitmapH *bitmapH))

watermarkW = sqr.toInt()

watermarkH = sqr.toInt()

//水印画布

        bitmapWaterMark = Bitmap.createBitmap(

watermarkW, watermarkH, Bitmap.Config.ARGB_8888

        )

markWaterCanvas = Canvas(bitmapWaterMark!!)

var ss =sqrt(2.toFloat()) /2

        markWaterCanvas?.translate(-((sqrt(2 *watermarkH *watermarkH.toFloat())) /2 -watermarkH /2)*ss,

            -((sqrt(2 *watermarkH *watermarkH.toFloat())) /2 -watermarkH /2)*ss)

//旋转

        markWaterCanvas?.rotate(

angle.toFloat(), (watermarkW /2).toFloat(),

            (watermarkW /2).toFloat()

)

//根据画布大小添加水印文字

        val textLength =textW +80

        val textColumn =textH +120

        val row: Int = (watermarkW / textLength).toInt()

val column: Int = (watermarkH / textColumn).toInt()

for (iin 0..row +1) {

var count =0

            for (jin 0..column +2) {

count++

if (count %2 ==0) {

markWaterCanvas?.drawText(

text,

                        textLength * i,

                        textColumn * j,

                        mPaint,

                    )

}else {

//偶数行进行错开

                    markWaterCanvas?.drawText(

text,

                        textLength * i + (textW /2),

                        textColumn * j,

                        mPaint,

                    )

}

}

}

if (bitmapWaterMark !=null) {

canvas?.drawBitmap(bitmapWaterMark!!, 0f, 0f, mPaint)

}

}

override fun setAlpha(alpha: Int) {

}

override fun setColorFilter(colorFilter: ColorFilter?) {

}

override fun getOpacity(): Int {

return PixelFormat.UNKNOWN

    }

companion object {

fun sp2px(context: Context, spValue: Float): Int {

val fontScale = context.resources.displayMetrics.scaledDensity

            return (spValue * fontScale +0.5f).toInt()

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容