Android圖像處理之繪制圓形、三角形及扇形的頭像
前言
相信大家在Android日常開發(fā)中,繪制圓形和繪制圖片都是很容易的事情,但是繪制圓形圖片就有點難倒人了。以前為了偷懶就直接去github上找一個開源項目,后來才發(fā)現(xiàn)繪制圓形圖片其實也是很簡單的事。
繪制圓形圖片也需要兩個步驟:
繪制圓形和繪制圖片,只不過要讓它們?nèi)〔⒓?,得到的結(jié)果就是一張圓形圖片了。
直接上代碼:
public class CircleImageView extends View {
private Paint mPaint;
private Paint mTargetPaint;
private Bitmap mSourceBitmap;
private Bitmap mTargetBitmap;
private Canvas mTargetCanvas;
private int mWidth;
private int mHeight;
public CircleImageView(Context context) {
this(context, null);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTargetPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTargetPaint.setXfermode(new PorterDuffXfermode(SRC_IN));
mSourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xiaojiangshi);
mTargetBitmap = Bitmap.createBitmap(mSourceBitmap.getWidth(), mSourceBitmap.getHeight(), Bitmap.Config.ARGB_8888);
mTargetCanvas = new Canvas(mTargetBitmap);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
@Override
protected void onDraw(Canvas canvas) {
// 生成圓形Bitmap過程.
int radius = Math.min(mWidth, mHeight) / 2;
// 先繪制圓形
mTargetCanvas.drawCircle(mWidth / 2, mHeight / 2, radius, mPaint);
// 再繪制Bitmap
mTargetCanvas.drawBitmap(mSourceBitmap, 0, 0, mTargetPaint);
canvas.drawBitmap(mTargetBitmap, 0, 0, null);
}
}
效果如下:

代碼中最關(guān)鍵的就是這句:
mTargetPaint.setXfermode(new PorterDuffXfermode(SRC_IN));
SRC_IN這種模式可以讓兩個繪制的效果取交集后展現(xiàn)出來,需要注意的是,dst需要先繪制,再繪制src,拿上面例子來說,就是要先繪制圓形,在繪制Bitmap,如果順序顛倒了,你就只能看到一個圓形了。
除了SRC_IN這種模式外,還有其它15種模式。有興趣的可以自己試試看效果。在官方提供的APIDemo中可以找到相應(yīng)的代碼。

知道這個原理之后,我們就能繪制各種形狀的圖片了,只需要繪制不同的形狀代替繪制圓形這一步驟就可以了。
三角形:
mPath.reset(); mPath.moveTo(mWidth / 2, 0); mPath.lineTo(0, mHeight); mPath.lineTo(mWidth, mHeight); mPath.close(); mTargetCanvas.drawPath(mPath, mPaint);

扇形:
RectF rectF = new RectF(0, 0, mWidth, mHeight); mTargetCanvas.drawArc(rectF, 210, 120, true, mPaint);

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對各位Android開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
android使用PopupWindow實現(xiàn)頁面點擊頂部彈出下拉菜單
這篇文章主要給大家介紹android使用PopupWindow實現(xiàn)頁面點擊頂部彈出下拉菜單,實現(xiàn)此功能主要通過PopupWindow方法,代碼也很簡單,需要的朋友可以參考下2015-08-08
android 仿微信demo——注冊功能實現(xiàn)(移動端)
本篇文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你們提供幫助2021-06-06
Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果
這篇文章主要介紹了Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果,具有一定的,感興趣的小伙伴們可以參考一下2016-07-07
Android中使用TabHost 與 Fragment 制作頁面切換效果
這篇文章主要介紹了Android中使用TabHost 與 Fragment 制作頁面切換效果的相關(guān)資料,需要的朋友可以參考下2016-03-03
基于Android6.0實現(xiàn)彈出Window提示框
這篇文章主要為大家詳細介紹了基于Android6.0實現(xiàn)彈出Window提示框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Kotlin中ListView與RecyclerView的應(yīng)用講解
這篇文章主要介紹了Kotlin中ListView與RecyclerView的應(yīng)用講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09
百度語音識別(Baidu Voice) Android studio版本詳解
這篇文章主要介紹了百度語音識別(Baidu Voice) Android studio版本詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android使用CrashHandler來獲取應(yīng)用的crash信息的方法
本篇文章主要介紹了Android使用CrashHandler來獲取應(yīng)用的crash信息的方法,具有一定的參考價值,有興趣的可以了解一下2017-09-09

