溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android怎么實(shí)現(xiàn)可配置透明度的水印

發(fā)布時(shí)間:2022-08-17 16:24:03 來源:億速云 閱讀:185 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Android怎么實(shí)現(xiàn)可配置透明度的水印”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Android怎么實(shí)現(xiàn)可配置透明度的水印”吧!

今天對(duì)Android端水印進(jìn)行了一個(gè)簡(jiǎn)單的優(yōu)化,優(yōu)化方式是對(duì)水印生成方式的修改。如圖1修改為如圖2。

Android怎么實(shí)現(xiàn)可配置透明度的水印

Android怎么實(shí)現(xiàn)可配置透明度的水印

我們先簡(jiǎn)單了解一下圖一水印是如生成得。

//創(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á)到理想的效果如圖所示:

Android怎么實(shí)現(xiàn)可配置透明度的水印

我們主要談?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ì)角線的長(zhǎng)度
        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è)屏幕得到的效果為:

Android怎么實(shí)現(xiàn)可配置透明度的水印

這樣做到了上下兩行得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)透明度配置。

感謝各位的閱讀,以上就是“Android怎么實(shí)現(xiàn)可配置透明度的水印”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Android怎么實(shí)現(xiàn)可配置透明度的水印這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI