Android可配置透明度的水印
今天對(duì)Android端水印進(jìn)行了一個(gè)簡單的優(yōu)化,優(yōu)化方式是對(duì)水印生成方式的修改。如圖1修改為如圖2。
我們先簡單了解一下圖一水印是如生成得。
//創(chuàng)建水印類構(gòu)造方法 public MarkDrawable(String mMarkStr,int textColor,int textSize,int backgroundColor) { ? ? this.mMarkStr = mMarkStr; ? ? this.mTextColor=textColor; ? ? this.mTextSize=textSize; ? ? this.mBackgroundColor=backgroundColor; }
//創(chuàng)建paint實(shí)例繪制文字 mPaint=new TextPaint(); mPaint.setTextSize(mTextSize); mPaint.setAntiAlias(true); mPaint.setColor(mTextColor); final float width=mPaint.measureText(mMarkStr,0,mMarkStr.length())*2;
這里我們創(chuàng)建了文字繪制工具進(jìn)行繪制文字
//繪制矩形 Rect rect=new Rect(); mPaint.getTextBounds(mMarkStr,0,mMarkStr.length(),rect); mBoundRect=new RectF(); //設(shè)置矩形得寬高 mBoundRect.set(0,0,(float) (width*Math.cos(Math.toRadians(mDegree) ))+inset,(float)(width*Math.sin(Math.toRadians(mDegree)))+inset); //在這里我們進(jìn)行繪制矩形,為了設(shè)置單個(gè)水印的寬高
接著我們開始在畫布上進(jìn)行繪制
public void draw(Canvas canvas) { ? ? canvas.save(); ? ? canvas.drawColor(mBackgroundColor); ? ? canvas.translate(mBoundRect.width()/2,mBoundRect.height()/2); ? ? canvas.rotate(-mDegree); ? ? canvas.drawText(mMarkStr,inset/2-mBoundRect.width()/2,0,mPaint); ? ? canvas.restore(); }
繪制出一個(gè)帶偏移角得文字
到這里我們前期工作完成繪制出了一個(gè)水印出來,現(xiàn)在我們需要將所有的水印鋪滿整個(gè)屏幕
//我們調(diào)用水印繪制得類 public WaterMarkDrawable(String markStr,int textColor,int textSize,int backgroundColor) { ? ? //在這里我們獲取到單個(gè)水印得實(shí)體類 ? ? this.mMarkDrawable = new MarkDrawable(markStr,textColor,textSize,backgroundColor); ? ? //設(shè)置水印矩形 ? ? mBoundRect = new RectF(); ? ? //水印寬高 ? ? final int width=mMarkDrawable.getIntrinsicWidth(); ? ? final ?int height=mMarkDrawable.getIntrinsicHeight(); ? ? //將水印轉(zhuǎn)成bitmap ? ? Bitmap bmp = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); ? ? //將水印繪制到畫布上 ? ? Canvas canvas = new Canvas(bmp); ? ? mMarkDrawable.setBounds(0,0,width,height);//用來確定繪制大小和位置 ? ? mMarkDrawable.draw(canvas); ? ? //利用bitmapshader類進(jìn)行重復(fù)xy軸平鋪 ? ? mShader = new BitmapShader(bmp, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);//基于繪制的第一個(gè)完成的bitmap,X軸Y軸方向重復(fù)的繪制bitmap ? ? mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//使位圖抗鋸齒的標(biāo)志 ? ? mPaint.setStyle(Paint.Style.FILL);//填充 ? ? //設(shè)置paint得shader ? ? mPaint.setShader(mShader); }
在這里我們先將畫出來的水印轉(zhuǎn)成bitmaph后再將其繪制到畫布上,最后利用BitmapShader進(jìn)行xy軸進(jìn)行重復(fù)平鋪從而做到布滿xy軸得需要,但到這里雖然平鋪了,但是是整齊得平鋪效果上并沒有達(dá)到理想的效果如圖所示:
我們主要談?wù)劦诙N方式:
第二種方式,不用轉(zhuǎn)成bitmap也沒有用到BitmapShader重復(fù)平鋪,而是利用暴力枚舉進(jìn)行對(duì)每一個(gè)x,y軸進(jìn)行遍歷對(duì)不同坐標(biāo)上進(jìn)行畫水印。
public void draw(@NonNull Canvas canvas) { ? ? ? ? //獲取屏幕寬度 ? ? ? ? int width = getBounds().right; ? ? ? ? //獲取屏幕高度 ? ? ? ? int height = getBounds().bottom; ? ? ? ? //獲取屏幕對(duì)角線 ? ? ? ? int diagonal = (int) Math.sqrt(width * width + height * height); // 對(duì)角線的長度 ? ? ? ? int Yspacing = 50; ? ? ? ? int XSpacing = 100; ? ? ? ? float textWidth; ? ? ? ? canvas.drawColor(0x00000000); ? ? ? ? canvas.rotate(mAngle); ? ? ? ? //文本寬度默認(rèn)第一個(gè)文本 ? ? ? ? if (!ListUtils.isEmpty(mContent)){ ? ? ? ? ? ? if (StringUtils.isEmpty(mContent.get(0))){ ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? //設(shè)置文本的寬度從而做到文本寬度得不固定 ? ? ? ? ? ? textWidth = mPaint.measureText(mContent.get(0)); ? ? ? ? ? ? mes = mContent.get(0); ? ? ? ? }else{ ? ? ? ? ? ? if (StringUtils.isEmpty(mMessage)){ ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? //設(shè)置文本的寬度從而做到文本寬度得不固定 ? ? ? ? ? ? textWidth = mPaint.measureText(mMessage); ? ? ? ? ? ? mes = mMessage; ? ? ? ? } ? ? ? ? //為了統(tǒng)計(jì)當(dāng)前在第幾行從而實(shí)現(xiàn)錯(cuò)開顯示 ? ? ? ? int index = 0; ? ? ? ? //記錄當(dāng)前的x軸坐標(biāo) ? ? ? ? float fromX; ? ? ? ? ? ? ? ? for (int positionY = diagonal / 10; positionY <= diagonal; positionY += (diagonal / 10+Yspacing)) { ? ? ? ? ? ? fromX = -width * 3 / 2 + (index++ % 2) * textWidth; // 上下兩行的X軸起始點(diǎn)不一樣,錯(cuò)開顯示 ? ? ? ? ? ? int spacing ?= 0;//間距 ? ? ? ? ? ? for (float positionX = fromX; positionX < width; positionX += (textWidth * 2+XSpacing)) { ? ? ? ? ? ? ? ? ? ? canvas.drawText(mes, positionX, positionY , mPaint); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? canvas.save(); ? ? ? ? canvas.restore(); ? ? }
這種方式主要利用暴力枚舉,y軸上在對(duì)角線比例高度得位置+間隔距離開始Y軸遍歷;x軸上在初始位置,每次兩倍字符串寬度+間隔得距離進(jìn)行x軸開始遍歷。最后鋪滿整個(gè)屏幕得到的效果為:
這樣做到了上下兩行得X軸起始點(diǎn)不一樣,錯(cuò)開顯示,實(shí)現(xiàn)界面美觀。
在最后我們直接調(diào)用:(因?yàn)槲覀兺该鞫日{(diào)用了接口所以大家知道就好傳入的參數(shù)為int型數(shù)據(jù))
var alpha: Int = WaterMarkUtils.getChildrenBean(WaterMarkUtils.SCENE_SHOP)?.whiteTransparency!! * 255 / 100 binding.tvWaterMark.background = ( ? ? WaterMarkBg( ? ? ? ? this, ? ? ? ? WaterMarkUtils.getMarkName( ? ? ? ? ? ? WaterMarkUtils.getChildrenBean(WaterMarkUtils.SCENE_SHOP) ? ? ? ? ), ? ? ? ? -15, ? ? ? ? 14, ? ? ? ? Color.argb(alpha, 0, 0, 0), ? ? ? ? Typeface.DEFAULT_BOLD ? ? ) )
最終實(shí)現(xiàn)透明度配置。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android視頻處理之動(dòng)態(tài)時(shí)間水印效果
- Android添加水印的正確方法 只要三步!
- Android實(shí)現(xiàn)為圖片添加水印
- Android 給圖片加上水印的示例代碼(支持logo+文字)
- Android給任何view添加全屏傾斜水印
- Android 圖片添加水印的實(shí)現(xiàn)方法
- Android給圖片加文字和圖片水印實(shí)例代碼
- android實(shí)現(xiàn)文字水印效果 支持多行水印
- Android圖片添加水印圖片并把圖片保存到文件存儲(chǔ)的實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)分享長圖并且添加全圖水印
相關(guān)文章
Android 6.0動(dòng)態(tài)權(quán)限申請教程
本文主要介紹了Android 6.0動(dòng)態(tài)權(quán)限申請的教程,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03OpenGL ES 矩陣變換及其數(shù)學(xué)原理詳解(五)
這篇文章主要為大家詳細(xì)介紹了OpenGL ES 矩陣變換及其數(shù)學(xué)原理的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android應(yīng)用創(chuàng)建多個(gè)快捷方式
本文主要介紹Android 生成多個(gè)快捷方式,這里提供代碼實(shí)例,詳細(xì)講解生成多個(gè)快捷方式的實(shí)現(xiàn)方法,有需要的朋友可以參考下2016-07-07Android自定義密碼樣式 黑點(diǎn)轉(zhuǎn)換成特殊字符
這篇文章主要為大家詳細(xì)介紹了Android自定義密碼樣式的制作方法,黑點(diǎn)換成¥、%等特殊字符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android開發(fā)仿IOS滑動(dòng)開關(guān)實(shí)現(xiàn)代碼
這篇文章主要介紹了 android開發(fā)仿IOS滑動(dòng)開關(guān)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05Android scheme 跳轉(zhuǎn)的設(shè)計(jì)與實(shí)現(xiàn)詳解
這篇文章主要介紹了Android scheme 跳轉(zhuǎn)的設(shè)計(jì)與實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Android TextView字體顏色設(shè)置方法小結(jié)
這篇文章主要介紹了Android TextView字體顏色設(shè)置方法,結(jié)合實(shí)例形式總結(jié)分析了Android開發(fā)中TextView設(shè)置字體顏色的常用技巧,需要的朋友可以參考下2016-02-02