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


在開發中常常會有一些需求,比方顯示頭像,顯示一些特殊的需求,將圖片顯示成圓角或者圓形或者其它的一些形狀。

可是往往我們手上的圖片或者從server獲取到的圖片都是方形的。這時候就須要我們自己進行處理,將圖片處理成所須要的形狀。正如茴香豆的的“茴”寫法大於一種。經過我的研究。畫出特殊圖片的方法也不是一種,我發現了三種。且聽我一一道來。

使用Xfermode 兩圖相交方式

通過查找資料發現android中能夠設置畫筆的Xfermode即相交模式,從而設置兩張圖相交之后的顯示方式。詳細模式見下圖,源代碼能夠去android apidemo。(SRC 為我們要畫到目標圖上的圖即原圖,DST為目標圖)


由上圖能夠看到,假設我們須要畫一個圓形的圖,能夠在畫布上面先畫一個跟目標大小一樣的圓,然后xfermode選擇SRC_IN,再講我們的頭像或者其它圖畫上去就能夠了。相同也能夠先畫我們的圖,再畫圓,只是xfermode要選擇DST_IN。兩種都能夠實現我們須要的效果。演示樣例代碼例如以下:

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種模式你事實上還能夠做出很多其它效果。另外,僅僅要你給一張相交圖。那張圖形狀什么樣,我們的圖就能夠顯示成什么樣。

通過裁剪畫布區域實現指定形狀的圖形

Android中Canvas提供了ClipPath, ClipRect, ClipRegion 等方法來裁剪,通過Path, Rect ,Region 的不同組合,Android差點兒能夠支持隨意形狀的裁剪區域。

因此,我們差點兒能夠獲取隨意形狀的區域,然后在這個區域上繪圖,就能夠獲得,我們要的圖片了。直接看演示樣例。

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

直接先看演示樣例

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,還能夠實現鏡面效果,也是極好的。

上面就是實現的三種方法,三種方法都能夠畫許多的形狀,當然遇到很很很很復雜的情況,我是建議使用第一種。這時候能夠讓美工給一張末班形狀圖。省自己去代碼繪制了。

大家依據自己的需求選擇。

在github上面CustomShapeImageView就是用了我們所說的第一種方法繪制。RoundedImageView 和CircleImageView則使用bitmapshader完畢,當然可能另一些其它的控件,或許還有其它的一些實現方法,假設你知道。能夠回復告訴我^_^。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM