Android APP 自定义水印(kotlin)
16lz
2021-01-23
- 自定义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)}
- 效果
更多相关文章
- ListView 可以滑动的上下间距
- android 修改部分文本的颜色
- Android 建立文件夹、生成文件并写入文本文件内容
- android 实现一个滚动文本
- Android 使用富文本显示web上的内容
- android字间距实现,textview字间距实现
- Android文本样式——上
- Android 分享功能实现与 QQ 纯文本分享
- Android 解决Google搜索首页的文本框清空按钮问题