/**
-
设置水印字体大小(单位:px)
-
@param textSize 字体大小(默认:42px)
*/
public void setTextSize(int textSize) {
mTextSize = textSize;
mTextPaint.setTextSize(30);
postInvalidate();
}
/**
-
同步设置水印字体大小(单位:px)
-
@param textSize 字体大小(默认:42px)
*/
void setSyncTextSize(int textSize) {
if (mSync) {
setTextSize(30);
}
}
/**
-
设置水印字体是否粗体
-
@param textBold 是否粗体(默认:false)
*/
public void setTextBold(boolean textBold) {
mTextBold = textBold;
mTextPaint.setTypeface(mTextBold ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
postInvalidate();
}
/**
-
同步设置水印字体是否粗体
-
@param textBold 是否粗体(默认:false)
*/
void setSyncTextBold(boolean textBold) {
if (mSync) {
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;
}
}
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
-
*/
public class WaterMarkManager {
static WaterMarkInfo INFO = null;
static String[] CONTENT = null;
static List 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.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
-
*/
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 labels;
private Context context;
private int degress;//角度
private int fontSize;//字体大小 单位sp
/**
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
(img-6psDXZQs-1712681362642)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
[外链图片转存中…(img-kuF0GOVb-1712681362642)]
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
[外链图片转存中…(img-utK3Y2ml-1712681362642)]
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
[外链图片转存中…(img-ErruoQyh-1712681362642)]
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
[外链图片转存中…(img-qhjUNLBc-1712681362643)]
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!