• 自定义WaterMarkView
/** * Created by guc on 2020/6/12. * Description:水印 */class WaterMarkView(context: Context, attrs: AttributeSet?, defStyle: Int) :    View(context, attrs, defStyle) {    constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)    constructor(context: Context) : this(context, null, 0)    companion object {        const val TAG = "WaterMarkView"        const val DEFAULT_RADIAN: Float = (PI / 6).toFloat()    }    var markText: CharSequence = "水印"    private val path = Path()    private var lineHeight = 0  //px    private var markerTextSize = 0f    private var singleMarkerWidth = 0    private var singleMarkerHeight = 0    private var markerSpace = 0//间距    private var deltaFixSpace = 0//修正间距    var radian = DEFAULT_RADIAN//弧度    private var repeatCountX = 1    private var repeatCountY = 1    private var repeatSpace = 1    private val paint = Paint().apply {        isAntiAlias = true        color = Color.DKGRAY        style = Paint.Style.FILL    }    init {        val a = context.obtainStyledAttributes(attrs, R.styleable.WaterMarkView)        markText = a.getString(R.styleable.WaterMarkView_markerText) ?: "水印"        LogG.loge(TAG, "获取前:$lineHeight")        lineHeight = a.getDimensionPixelOffset(            R.styleable.WaterMarkView_lineHeight,            dp2px(50f)        )        LogG.loge(TAG, "获取后:$lineHeight")        markerTextSize = a.getDimension(R.styleable.WaterMarkView_markerTextSize, 48f)        markerSpace =            a.getDimension(R.styleable.WaterMarkView_markerSpace, dp2px(30f).toFloat()).toInt()        deltaFixSpace =            a.getDimension(R.styleable.WaterMarkView_fixSpace, markerSpace.toFloat() / 2).toInt()        radian = a.getFloat(R.styleable.WaterMarkView_radian, DEFAULT_RADIAN)        a.recycle()    }    @SuppressLint("DrawAllocation")    override fun onDraw(canvas: Canvas) {        super.onDraw(canvas)        val rectText = Rect()        paint.textSize = markerTextSize        paint.getTextBounds(markText.toString(), 0, markText.toString().length, rectText)        singleMarkerWidth = rectText.width()        singleMarkerHeight = rectText.height()        val space = "a"        paint.getTextBounds(space, 0, space.length, rectText)        repeatSpace = markerSpace / rectText.width()        repeatCountX = ceil(width * 1.0 / cos(radian) / (singleMarkerWidth + markerSpace)).toInt()        repeatCountY = floor(height * 1.0 / lineHeight).toInt()        val itemStdHeight = getItemHeight()        for (i in 1..repeatCountY) {            path.reset()            path.moveTo(0f + deltaFixSpace, i * lineHeight.toFloat())            val x = getEndX(itemStdHeight, i) + deltaFixSpace            val y = getEndY(itemStdHeight, i)            path.lineTo(x, y)            canvas.drawTextOnPath(getLineText(), path, 0f, 0f, paint)        }    }    private fun isEnoughHeight(itemHeight: Float, times: Int) = itemHeight <= times * lineHeight    private fun getEndX(itemHeight: Float, times: Int): Float =        if (isEnoughHeight(                itemHeight,                times            )        ) width.toFloat() else (lineHeight * times * 1.0f / tan(            radian        ))    private fun getEndY(itemHeight: Float, times: Int): Float =        if (isEnoughHeight(itemHeight, times)) (lineHeight * times - itemHeight) else 0f    private fun getItemHeight(): Float {        return width * tan(radian)    }    private fun getLineText(): String {        val sb = StringBuilder()        repeat(repeatCountX) {            sb.append(markText)            repeat(repeatSpace) {                sb.append(" ")            }        }        return sb.toString()    }    private fun dp2px(dipValue: Float): Int {        val scale = resources.displayMetrics.density        return (dipValue * scale + 0.5f).toInt()    }}
  • 自定义属性
                        
  • 创建水印布局layout_water_mark.xml
<?xml version="1.0" encoding="utf-8"?>
  • 调用Api
object WaterMarkUtil{    private const val VIEW_TAG = "view_tag"    var enable = false    var text = "水印"    //在Activity的onActivityStart()方法调用    fun onActivityStart(activity:Activity){         val rootView = activity.window.decorView.findViewById(android.R.id.content)        if (enable && text.isNotEmpty() && rootView.findViewWithTag(VIEW_TAG) == null) {            val waterMarkView =                LayoutInflater.from(activity)                    .inflate(R.layout.layout_water_mark, null) as WaterMarkView            waterMarkView.tag = VIEW_TAG            waterMarkView.markText = text            rootView.addView(waterMarkView)        }            }}
  • 水印设置及调用
//开启水印,并设置水印文本override fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState)    WaterMarkUtil.enable = true    WaterMarkUtil.text = "自定义水印"}//添加水印override fun onStart() {    super.onStart()    WaterMarkUtil.onActivityStart(this)}
  • 效果

Android APP 自定义水印(kotlin)_第1张图片

 

更多相关文章

  1. ListView 可以滑动的上下间距
  2. android 修改部分文本的颜色
  3. Android 建立文件夹、生成文件并写入文本文件内容
  4. android 实现一个滚动文本
  5. Android 使用富文本显示web上的内容
  6. android字间距实现,textview字间距实现
  7. Android文本样式——上
  8. Android 分享功能实现与 QQ 纯文本分享
  9. Android 解决Google搜索首页的文本框清空按钮问题

随机推荐

  1. Android 实现下载时主界面与详细界面一致
  2. Android 使用HttpClient方式提交POST请求
  3. android 文件的读取与写入以及TextView的
  4. android判断网络的状态断开与否
  5. android 照片旋转并保存
  6. java(Android)——内存泄露的一些经典案
  7. android之获取当前日期所属的本周、本月
  8. Android两种轮询的实现方法
  9. Android 增加LOG
  10. 实现TextView在内容过多时自动滚动