您好,登錄后才能下訂單哦!
這篇文章主要講解了“Android怎么實現可配置透明度的水印”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android怎么實現可配置透明度的水印”吧!
今天對Android端水印進行了一個簡單的優化,優化方式是對水印生成方式的修改。如圖1修改為如圖2。
我們先簡單了解一下圖一水印是如生成得。
//創建水印類構造方法 public MarkDrawable(String mMarkStr,int textColor,int textSize,int backgroundColor) { this.mMarkStr = mMarkStr; this.mTextColor=textColor; this.mTextSize=textSize; this.mBackgroundColor=backgroundColor; }
//創建paint實例繪制文字 mPaint=new TextPaint(); mPaint.setTextSize(mTextSize); mPaint.setAntiAlias(true); mPaint.setColor(mTextColor); final float width=mPaint.measureText(mMarkStr,0,mMarkStr.length())*2;
這里我們創建了文字繪制工具進行繪制文字
//繪制矩形 Rect rect=new Rect(); mPaint.getTextBounds(mMarkStr,0,mMarkStr.length(),rect); mBoundRect=new RectF(); //設置矩形得寬高 mBoundRect.set(0,0,(float) (width*Math.cos(Math.toRadians(mDegree) ))+inset,(float)(width*Math.sin(Math.toRadians(mDegree)))+inset); //在這里我們進行繪制矩形,為了設置單個水印的寬高
接著我們開始在畫布上進行繪制
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(); }
繪制出一個帶偏移角得文字
到這里我們前期工作完成繪制出了一個水印出來,現在我們需要將所有的水印鋪滿整個屏幕
//我們調用水印繪制得類 public WaterMarkDrawable(String markStr,int textColor,int textSize,int backgroundColor) { //在這里我們獲取到單個水印得實體類 this.mMarkDrawable = new MarkDrawable(markStr,textColor,textSize,backgroundColor); //設置水印矩形 mBoundRect = new RectF(); //水印寬高 final int width=mMarkDrawable.getIntrinsicWidth(); final int height=mMarkDrawable.getIntrinsicHeight(); //將水印轉成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類進行重復xy軸平鋪 mShader = new BitmapShader(bmp, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);//基于繪制的第一個完成的bitmap,X軸Y軸方向重復的繪制bitmap mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//使位圖抗鋸齒的標志 mPaint.setStyle(Paint.Style.FILL);//填充 //設置paint得shader mPaint.setShader(mShader); }
在這里我們先將畫出來的水印轉成bitmaph后再將其繪制到畫布上,最后利用BitmapShader進行xy軸進行重復平鋪從而做到布滿xy軸得需要,但到這里雖然平鋪了,但是是整齊得平鋪效果上并沒有達到理想的效果如圖所示:
我們主要談談第二種方式:
第二種方式,不用轉成bitmap也沒有用到BitmapShader重復平鋪,而是利用暴力枚舉進行對每一個x,y軸進行遍歷對不同坐標上進行畫水印。
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); //文本寬度默認第一個文本 if (!ListUtils.isEmpty(mContent)){ if (StringUtils.isEmpty(mContent.get(0))){ return; } //設置文本的寬度從而做到文本寬度得不固定 textWidth = mPaint.measureText(mContent.get(0)); mes = mContent.get(0); }else{ if (StringUtils.isEmpty(mMessage)){ return; } //設置文本的寬度從而做到文本寬度得不固定 textWidth = mPaint.measureText(mMessage); mes = mMessage; } //為了統計當前在第幾行從而實現錯開顯示 int index = 0; //記錄當前的x軸坐標 float fromX; for (int positionY = diagonal / 10; positionY <= diagonal; positionY += (diagonal / 10+Yspacing)) { fromX = -width * 3 / 2 + (index++ % 2) * textWidth; // 上下兩行的X軸起始點不一樣,錯開顯示 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軸上在初始位置,每次兩倍字符串寬度+間隔得距離進行x軸開始遍歷。最后鋪滿整個屏幕得到的效果為:
這樣做到了上下兩行得X軸起始點不一樣,錯開顯示,實現界面美觀。
在最后我們直接調用:(因為我們透明度調用了接口所以大家知道就好傳入的參數為int型數據)
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 ) )
最終實現透明度配置。
感謝各位的閱讀,以上就是“Android怎么實現可配置透明度的水印”的內容了,經過本文的學習后,相信大家對Android怎么實現可配置透明度的水印這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。