前言
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了永興免費建站歡迎大家使用!
相信大家在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ā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。