在android中畫圓形圖片的幾種辦法

在開發中常常會有一些需求,好比顯示頭像,顯示一些特殊的需求,將圖片顯示成圓角或者圓形或者其餘的一些形狀。可是每每咱們手上的圖片或者從服務器獲取到的圖片都是方形的。這時候就須要咱們本身進行處理,將圖片處理成所須要的形狀。正如茴香豆的的「茴」寫法大於一種,通過個人研究,畫出特殊圖片的方法也不是一種,我發現了三種,且聽我一一道來。java

使用Xfermode 兩圖相交方式

經過查找資料發現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);  //把圖畫上去

使用BitmapShader

直接先看示例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就是用了咱們所說的第一種方法繪製。RoundedImageViewCircleImageView則使用bitmapshader完成,固然可能還有一些其餘的控件,也許還有其餘的一些實現方法,若是你知道,能夠回覆告訴我^_^。code

原文地址:http://blog.isming.me/2014/09/19/draw-circle-image-in-android/,轉載請註明出處。blog

相關文章
相關標籤/搜索