写点什么

Android 实现水印背景效果,kotlin 教程

发布于: 2 小时前

setTextBold(textBold);


}


}


/**


  • 设置水印 X 轴偏移量(单位:px)

  • @param dx X 轴偏移量(默认:100px)


*/


public void setDx(int dx) {


this.mDx = dx;


postInvalidate();


}


/**


  • 同步设置水印 X 轴偏移量(单位:px)

  • @param dx X 轴偏移量(默认:100px)


*/


void setSyncDx(int dx) {


if (mSync) {


setDx(dx);


}


}


/**


  • 设置水印 Y 轴偏移量(单位:px)

  • @param dy Y 轴偏移量(默认:240px)


*/


public void setDy(int dy) {


this.mDy = dy;


postInvalidate();


}


/**


  • 同步设置水印 Y 轴偏移量(单位:px)

  • @param dy Y 轴偏移量(默认:240px)


*/


void setSignDy(int dy) {


if (mSync) {


setDy(dy);


}


}


/**


  • 设置水印对齐方式

  • @param align 对齐方式(默认:Center)


*/


public void setAlign(Paint.Align align) {


this.mAlign = align;


postInvalidate();


}


/**


  • 同步设置水印对齐方式

  • @param align 对齐方式(默认:Center)


*/


void setSignAlign(Paint.Align align) {


if (mSync) {


setAlign(align);


}


}


/**


  • 销毁相关页面时调用(切记)


*/


public void onDestroy() {


if (mSync) {


WaterMarkManager.LIST.remove(this);


}


}


@Override


public boolean dispatchTouchEvent(MotionEvent event) {


return false;


}


@SuppressLint("ClickableViewAccessibility")


@Override


public boolean onTouchEvent(MotionEvent event) {


return false;


}


}


<declare-styleable name="WaterMarkView">


<attr name="water_mark_degree" format="integer|reference" />


<attr name="water_mark_text" format="string|reference" />


<attr name="water_mark_textColor" format="color|reference" />


<attr name="water_mark_textSize" format="dimension|reference" />


<attr name="water_mark_textBold" format="boolean" />


<attr name="water_mark_dx" format="dimension|reference" />


<attr name="water_mark_dy" format="dimension|reference" />


<attr name="water_mark_align" format="dimension">


<enum name="LEFT" value="0" />


<enum name="CENTER" value="1" />


<enum name="RIGHT" value="2" />


</attr>


<attr name="water_mark_sync" format="boolean" />


</declare-styleable>


package com.hkdc.commonlib.warkmark;


import android.annotation.SuppressLint;


import android.app.Activity;


import android.graphics.Paint;


import android.view.LayoutInflater;


import com.hkdc.commonlib.R;


import java.util.ArrayList;


import java.util.List;


/**


  • @author Leon (wshk729@163.com)

  • @date 2018/8/24

  • <p>


*/


public class WaterMarkManager {


static WaterMarkInfo INFO = null;


static String[] CONTENT = null;


static List<WaterMarkView> LIST = new ArrayList<>();


/**


  • 设置水印全局配置信息

  • @param info 配置信息


*/


public static void setInfo(WaterMarkInfo info) {


INFO = info;


}


/**


  • 获取一个满屏水印 View

  • @param activity activity


*/


@SuppressLint("InflateParams")


public static WaterMarkView getView(Activity activity) {


return (WaterMarkView) LayoutInflater.from(activity).inflate(R.layout.view_water_mark, null);


}


/**


  • WaterMarkInfo 初始化判断


*/


private static void assertInitialized() {


if (INFO == null) {


INFO = WaterMarkInfo.create().generate();


}


}


/**


  • 同步设置全部水印文字信息

  • @param content 文字信息


*/


public static void setText(String... content) {


assertInitialized();


CONTENT = content;


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view.setSyncText(content);


}


}


}


}


/**


  • 同步设置全部水印倾斜角度

  • @param degrees 倾斜角度(默认:-30)


*/


public static void setDegrees(int degrees) {


assertInitialized();


INFO.setDegrees(degrees);


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view.setSyncDegrees(degrees);


}


}


}


}


/**


  • 同步设置全部水印字体颜色

  • @param textColor 字体颜色(默认:#33000000)


*/


public static void setTextColor(int textColor) {


assertInitialized();


INFO.setTextColor(textColor);


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view.setSyncTextColor(textColor);


}


}


}


}


/**


  • 同步设置全部水印字体大小(单位:px)

  • @param textSize 字体大小(默认:42px)


*/


public static void setTextSize(int textSize) {


assertInitialized();


INFO.setTextSize(textSize);


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


.setSyncTextSize(textSize);


}


}


}


}


/**


  • 同步设置全部水印字体是否粗体

  • @param textBold 是否粗体(默认:false)


*/


public static void setTextBold(boolean textBold) {


assertInitialized();


INFO.setTextBold(textBold);


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view.setSyncTextBold(textBold);


}


}


}


}


/**


  • 同步设置全部水印 X 轴偏移量(单位:px)

  • @param dx X 轴偏移量(默认:100px)


*/


public static void setDx(int dx) {


assertInitialized();


INFO.setDx(dx);


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view.setSyncDx(dx);


}


}


}


}


/**


  • 同步设置全部水印 Y 轴偏移量(单位:px)

  • @param dy Y 轴偏移量(默认:240px)


*/


public static void setDy(int dy) {


assertInitialized();


INFO.setDy(dy);


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view.setSignDy(dy);


}


}


}


}


/**


  • 同步设置全部水印对齐方式

  • @param align 对齐方式(默认:Center)


*/


public static void setAlign(Paint.Align align) {


assertInitialized();


INFO.setAlign(align);


if (LIST.size() > 0) {


for (WaterMarkView view : LIST) {


if (view != null) {


view.setSignAlign(align);


}


}


}


}


}


view_water_mark.xml


<?xml version="1.0" encoding="utf-8"?>


<com.commonlib.WaterMarkView


xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="match_parent"


android:layout_height="match_parent"/>


import android.graphics.Color;


import android.graphics.Paint;


/**


  • @author Leon (wshk729@163.com)

  • @date 2018/8/24

  • <p>


*/


public class WaterMarkInfo {


private int mDegrees;


private int mTextColor;


private int mTextSize;


private boolean mTextBold;


private int mDx;


private int mDy;


private Paint.Align mAlign;


private WaterMarkInfo(int degrees, int textColor, int textSize, boolean textBold, int dx, int dy, Paint.Align align) {


mDegrees = degrees;


mTextColor = textColor;


mTextSize = textSize;


mTextBold = textBold;


mDx = dx;


mDy = dy;


mAlign = align;


}


public int getDegrees() {


return mDegrees;


}


public int getTextColor() {


return mTextColor;


}


public int getTextSize() {


return mTextSize;


}


public int getDx() {


return mDx;


}


public int getDy() {


return mDy;


}


public Paint.Align getAlign() {


return mAlign;


}


public int getAlignInt() {


switch (mAlign) {


case LEFT:


return 0;


case RIGHT:


return 2;


default:


return 1;


}


}


public boolean isTextBold() {


return mTextBold;


}


void setDegrees(int degrees) {


mDegrees = degrees;


}


void setTextColor(int textColor) {


mTextColor = textColor;


}


void setTextSize(int textSize) {


mTextSize = textSize;


}


void setTextBold(boolean textBold) {


mTextBold = textBold;


}


void setDx(int dx) {


mDx = dx;


}


void setDy(int dy) {


mDy = dy;


}


void setAlign(Paint.Align align) {


this.mAlign = align;


}


public static Builder create() {


return new Builder();


}


public static class Builder {


private int mDegrees;


private int mTextColor;


private int mTextSize;


private boolean mTextBold;


private int mDx;


private int mDy;


private Paint.Align mAlign;


private Builder() {


mDegrees = -30;


mTextColor = Color.parseColor("#33000000");


mTextSize = 35;


mTextBold = false;


mDx = 100;


mDy = 240;


mAlign = Paint.Align.CENTER;


}


/**


  • 设置水印文字倾斜度

  • @param degrees 文字倾斜度(默认:-30)

  • @return Builder


*/


public Builder setDegrees(int degrees) {


mDegrees = degrees;


return this;


}


/**


  • 设置水印文字颜色

  • @param textColor 文字颜色(默认:#33000000)

  • @return Builder


*/


public Builder setTextColor(int textColor) {


mTextColor = textColor;


return this;


}


/**


  • 设置水印文字大小(单位:px)

  • @param textSize 文字大小(默认:42px)

  • @return Builder


*/


public Builder setTextSize(int textSize) {


mTextSize = textSize;


return this;


}


/**


  • 设置水印文字是否加粗

  • @param textBold 文字加粗(默认:false)

  • @return Builder


*/


public Builder setTextBold(boolean textBold) {


mTextBold = textBold;


return this;


}


/**


  • 设置水印文字 X 轴间距(单位:px)

  • @param dx 文字 X 轴间距(默认:100px)

  • @return Builder


*/


public Builder setDx(int dx) {


mDx = dx;


return this;


}


/**


  • 设置水印文字 Y 轴间距(单位:px)

  • @param dy 文字 Y 轴间距(默认:240px)

  • @return Builder


*/


public Builder setDy(int dy) {


mDy = dy;


return this;


}


/**


  • 设置水印文字对齐方式

  • @param align 对齐方式(默认:Center)

  • @return Builder


*/


public Builder setAlign(Paint.Align align) {


mAlign = align;


return this;


}


/**


  • 生成水印全局配置信息

  • @return 配置信息


*/


public WaterMarkInfo generate() {


return new WaterMarkInfo(mDegrees, mTextColor, mTextSize, mTextBold, mDx, mDy, mAlign);


}


}


}


import android.content.Context;


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.support.annotation.IntRange;


import android.support.annotation.NonNull;


import android.support.annotation.Nullable;


import java.util.List;


public class WaterMarkBg extends Drawable {


private Paint paint = new Paint();


private List<String> labels;


private Context context;


private int degress;//角度


private int fontSize;//字体大小 单位 sp


/**


  • 初始化构造

  • @param context 上下文

  • @param labels 水印文字列表 多行显示支持

  • @param degress 水印角度

  • @param fontSize 水印文字大小


*/


public WaterMarkBg(Context context, List<String> labels, int degress, int fontSize) {


this.labels = labels;


this.context = context;


this.degress = degress;


this.fontSize = fontSize;


}


@Override


public void draw(@NonNull Canvas canvas) {


int width = getBounds().right;


int height = getBounds().bottom;


canvas.drawColor(Color.parseColor("#40F3F5F9"));


paint.setColor(Color.parseColor("#50AEAEAE"));


paint.setAntiAlias(true);


paint.setTextSize(sp2px(context,fontSize));


canvas.save();


canvas.rotate(degress);


float textWidth = paint.measureText(labels.get(0));


int index = 0;


for (int positionY = height / 10; positionY <= height; positionY += height / 10+80) {


float fromX = -width + (index++ % 2) * textWidth;


for (float positionX = fromX; positionX < width; positionX += textWidth * 2) {


int spacing = 0;//间距


for(String label:labels){


canvas.drawText(label, positionX, positionY+spacing, paint);


spacing = spacing+50;


}


}


}


canvas.restore();


}


@Override


public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {


}


@Override


public void setColorFilter(@Nullable ColorFilter colorFilter) {


}


@Override


public int getOpacity() {


return PixelFormat.UNKNOWN;


}


public static int sp2px(Context context, float spValue) {


final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;


return (int) (spValue * fontScale + 0.5f);


}


}


xml 中 引用


<com.commonlib.WaterMarkView


android:singleLine="false"


android:id="@+id/wm"


android:layout_width="match_parent"


android:layout_height="match_parent"


app:water_mark_align="CENTER"


app:water_mark_degree="-30"


app:water_mark_dx="100px"


app:water_mark_dy="240px"


app:water_mark_sync="true"


app:water_mark_text="再见孙悟空"


app:water_mark_textBold="false"


app:water_mark_textColor="@color/black"


app:water_mark_textSize="30px" />

评论

发布
暂无评论
Android 实现水印背景效果,kotlin教程