在開發中常常會有一些需求,好比顯示頭像,顯示一些特殊的需求,將圖片顯示成圓角或者圓形或者其餘的一些形狀。可是每每咱們手上的圖片或者從服務器獲取到的圖片都是方形的。這時候就須要咱們本身進行處理,將圖片處理成所須要的形狀。正如茴香豆的的「茴」寫法大於一種,通過個人研究,畫出特殊圖片的方法也不是一種,我發現了三種,且聽我一一道來。java
經過查找資料發現android中能夠設置畫筆的Xfermode即相交模式,從而設置兩張圖相交以後的顯示方式,具體模式見下圖,源碼能夠去android apidemo。(SRC 爲咱們要畫到目標圖上的圖即原圖,DST爲目標圖)android
由上圖能夠看到,若是咱們須要畫一個圓形的圖,能夠在畫布上面先畫一個跟目標大小同樣的圓,而後xfermode選擇SRC_IN,再講咱們的頭像或者其餘圖畫上去就能夠了。一樣也能夠先畫咱們的圖,再畫圓,不過xfermode要選擇DST_IN。兩種均可以實現咱們須要的效果。示例代碼以下:git
Paint p = new Paint(); p.setAntiAlias(true); //去鋸齒 p.setColor(Color.BLACK); p.setStyle(Paint.Style.STROKE); Canvas canvas = new Canvas(bitmap); //bitmap就是咱們原來的圖,好比頭像 p.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); //由於咱們先畫了圖因此DST_IN int radius = bitmap.getWidth; //假設圖片是正方形的 canvas.drawCircle(radius, radius, radius, p); //r=radius, 圓心(r,r)
以上就是簡單的示例,根據以上的16種模式你其實還能夠作出更多效果。另外,只要你給一張相交圖,那張圖形狀什麼樣,咱們的圖就能夠顯示成什麼樣。github
Android中Canvas提供了ClipPath, ClipRect, ClipRegion 等方法來裁剪,經過Path, Rect ,Region 的不一樣組合,Android幾乎能夠支持任意形狀的裁剪區域。所以,咱們幾乎能夠獲取任意形狀的區域,而後在這個區域上畫圖,就能夠得到,咱們要的圖片了,直接看示例。canvas
int radius = src.getWidth() / 2; //src爲咱們要畫上去的圖,跟上一個示例中的bitmap同樣。 Bitmap dest = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(dest); Paint paint = new Paint(); paint.setColor(Color.BLACK); paint.setAntiAlias(true); Path path = new Path(); path.addCircle(radius, radius, radius, Path.Direction.CW); c.clipPath(path); //裁剪區域 c.drawBitmap(src, 0, 0, paint); //把圖畫上去
直接先看示例api
int radius = src.getWidth() / 2; BitmapShader bitmapShader = new BitmapShader(src, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); Bitmap dest = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(dest); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setShader(bitmapShader); c.drawCircle(radius,radius, radius, paint);
Shader就是畫筆的渲染器,本質上這中方法實際上是畫圓,可是渲染採用了咱們的圖片,而後就能夠得到指定的形狀了。可是我以爲,這個不適合畫很複雜的圖形,可是在內存消耗上,應該比第一種小不少。同時呢,設置Shader.TileMode.MIRROR,還能夠實現鏡面效果,也是極好的。服務器
上面就是實現的三種方法,三種方法均可以畫不少的形狀,固然遇到很是很是很是很是複雜的狀況,我是建議使用第一種,這時候可讓美工給一張末班形狀圖,省本身去代碼繪製了。你們根據本身的需求選擇。ide
在github上面CustomShapeImageView就是用了咱們所說的第一種方法繪製。RoundedImageView 和CircleImageView則使用bitmapshader完成,固然可能還有一些其餘的控件,也許還有其餘的一些實現方法,若是你知道,能夠回覆告訴我^_^。code
原文地址:http://blog.isming.me/2014/09/19/draw-circle-image-in-android/,轉載請註明出處。blog