最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android可配置透明度的水印

 更新時間:2022年08月17日 14:36:31   作者:qq377138858  
這篇文章主要為大家詳細(xì)介紹了Android可配置透明度的水印,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

今天對Android端水印進(jìn)行了一個簡單的優(yōu)化,優(yōu)化方式是對水印生成方式的修改。如圖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è)置單個水印的寬高

接著我們開始在畫布上進(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();
}

繪制出一個帶偏移角得文字

到這里我們前期工作完成繪制出了一個水印出來,現(xiàn)在我們需要將所有的水印鋪滿整個屏幕

//我們調(diào)用水印繪制得類

public WaterMarkDrawable(String markStr,int textColor,int textSize,int backgroundColor) {
? ? //在這里我們獲取到單個水印得實(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);//基于繪制的第一個完成的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)行對每一個x,y軸進(jìn)行遍歷對不同坐標(biāo)上進(jìn)行畫水印。

public void draw(@NonNull Canvas canvas) {
? ? ? ? //獲取屏幕寬度
? ? ? ? int width = getBounds().right;
? ? ? ? //獲取屏幕高度
? ? ? ? int height = getBounds().bottom;
? ? ? ? //獲取屏幕對角線
? ? ? ? int diagonal = (int) Math.sqrt(width * width + height * height); // 對角線的長度
? ? ? ? int Yspacing = 50;
? ? ? ? int XSpacing = 100;
? ? ? ? float textWidth;
? ? ? ? canvas.drawColor(0x00000000);
? ? ? ? canvas.rotate(mAngle);
? ? ? ? //文本寬度默認(rèn)第一個文本
? ? ? ? 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)計當(dāng)前在第幾行從而實(shí)現(xiàn)錯開顯示
? ? ? ? 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)不一樣,錯開顯示
? ? ? ? ? ? int spacing ?= 0;//間距
? ? ? ? ? ? for (float positionX = fromX; positionX < width; positionX += (textWidth * 2+XSpacing)) {
? ? ? ? ? ? ? ? ? ? canvas.drawText(mes, positionX, positionY , mPaint);
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? canvas.save();
? ? ? ? canvas.restore();
? ? }

這種方式主要利用暴力枚舉,y軸上在對角線比例高度得位置+間隔距離開始Y軸遍歷;x軸上在初始位置,每次兩倍字符串寬度+間隔得距離進(jìn)行x軸開始遍歷。最后鋪滿整個屏幕得到的效果為:

這樣做到了上下兩行得X軸起始點(diǎn)不一樣,錯開顯示,實(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

黄大仙区| 麻城市| 民乐县| 千阳县| 茶陵县| 偃师市| 兴仁县| 宁南县| 墨脱县| 桐柏县| 北川| 大宁县| 西乌珠穆沁旗| 饶平县| 夏津县| 姜堰市| 赫章县| 泗洪县| 册亨县| 西华县| 天津市| 博白县| 广昌县| 临泽县| 和平区| 松滋市| 基隆市| 开鲁县| 桓台县| 电白县| 特克斯县| 定结县| 策勒县| 逊克县| 荃湾区| 英超| 宣威市| 谷城县| 栖霞市| 当雄县| 稻城县|