十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
本篇文章給大家分享的是有關(guān)Android中怎么對(duì)圖片進(jìn)行圓角處理,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)、網(wǎng)站重做改版、東川網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為東川等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
方法一:setXfermode法
此種方式就是再new一個(gè)相同尺寸的bitmap,然后使用paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));先畫(huà)圓角矩形,再畫(huà)原始bitmap,然后就得到了一個(gè)圓角的bitmap了。
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; }
點(diǎn)評(píng):
早期用得較多,占用bitmap雙倍內(nèi)存。
方法二:使用BitmapShader
此種方式是先將bitmap生成BitmapShader,然后將其繪制到canvas中, 部分關(guān)鍵代碼如下,完整代碼請(qǐng)參考QuickAF中的RoundImageView
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); paint.setShader(bitmapShader); @Override public void draw(Canvas canvas) { Rect bounds = getBounds(); canvas.drawRoundRect(fillRect, radius, radius, paint); if (mBorderWidth > 0) { if (mIsCircle) { canvas.drawCircle(bounds.width() / 2, bounds.height() / 2, radius, strokePaint); } else { canvas.drawRoundRect(fillRect, radius, radius, strokePaint); } } }
點(diǎn)評(píng):
占用內(nèi)存較大,實(shí)現(xiàn)有點(diǎn)小復(fù)雜。
方法三:圖片加載庫(kù)
目前github上有許多流行的圖片加載庫(kù),基于上都附帶圓角圖片功能,只需要稍微配置一下,即可輕松的實(shí)現(xiàn)想要的效果。其實(shí)在底層,無(wú)非也是使用上面的兩種方式。比如Android-Universal-Image-Loader 早期的RoundedBitmapDisplayer使用setXfermode來(lái)實(shí)現(xiàn),后來(lái)使用BitmapShader實(shí)現(xiàn)。
DisplayImageOptions options = new DisplayImageOptions.Builder() .displayer(new RoundedBitmapDisplayer()) // display rounded bitmap .build();
再以比較另類(lèi)的fresco為例,雖然底層是以C實(shí)現(xiàn),不過(guò)在圓角處理上,仍然還是在Java層實(shí)現(xiàn),用的方式還是BitmapShader。不過(guò)對(duì)于非bitmap的圓角實(shí)現(xiàn),fresco是用Paint直接畫(huà)的。附上fresco配置。
點(diǎn)評(píng):
由框架實(shí)現(xiàn),使用簡(jiǎn)單,穩(wěn)定。
方法四:遮罩
此種方式還是使用setXfermode,不過(guò)與方法一不同的是:不對(duì)圖片作任何更改,只在圓角之外再畫(huà)一層與背景顏色相同的四個(gè)角來(lái)遮擋,在視覺(jué)上造成圓角圖片的效果。關(guān)鍵代碼如下:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (src != null && dst != null) { int w = getMeasuredWidth(), h = getMeasuredHeight(); int sc = canvas.saveLayer(0, 0, w, h, null, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); canvas.drawBitmap(dst, 0, 0, paint); // 圓角矩形 paint.setXfermode(mode); // new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT); canvas.drawBitmap(src, 0, 0, paint); // 長(zhǎng)方形 paint.setXfermode(null); canvas.restoreToCount(sc); } }
詳細(xì)代碼請(qǐng)參考QuickAF中的RoundMaskView
使用這種方式,圓角化的對(duì)象不限于ImageView,還可以是任意的layout哦,比如下面的示例
配合FrameLayout,將LinearLayout實(shí)現(xiàn)了圓角,在視覺(jué)效果上,ImageView左上和右上圓角,TextView左下和右下圓角。
點(diǎn)評(píng):
具有一定的局限性,不過(guò)不限于圖片,所有的Layout都可以在視覺(jué)上實(shí)現(xiàn)圓角。
以上就是Android中怎么對(duì)圖片進(jìn)行圓角處理,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。