觀看此篇文章前,請先閱讀上篇文章:高仿QQ頭像截取;
本篇之所以爲升級版,是在截取頭像界面添加了與qq類似的陰影層(裁剪區域以外的部分),且看效果圖:
爲了適應大家不同需求,這次打了兩個包,及上圖中一個方形的頭像截取demo和一個圓形的;
原理:
方形:
如圖:底層即圖片層,在上層的畫布中,先將裁剪區四周根據裁剪區大小畫上陰影,然後在畫上裁剪區的白色邊框(空心):如下圖
主要代碼如下:
- @Override
- protected void onDraw(Canvas canvas)
- {
- super.onDraw(canvas);
- // 計算矩形區域的寬度
- mWidth = getWidth() - 2 * mHorizontalPadding;
- // 計算距離屏幕垂直邊界 的邊距
- mVerticalPadding = (getHeight() - mWidth) / 2;
- // 繪製左邊
- canvas.drawRect(0, 0, mHorizontalPadding, getHeight()-mVerticalPadding, mPaintRect);
- // 繪製右邊
- canvas.drawRect(getWidth() - mHorizontalPadding, mVerticalPadding, getWidth(),getHeight(), mPaintRect);
- // 繪製上邊
- canvas.drawRect(mHorizontalPadding, 0, getWidth(),mVerticalPadding, mPaintRect);
- // 繪製下邊
- canvas.drawRect(0, getHeight() - mVerticalPadding,getWidth() - mHorizontalPadding, getHeight(), mPaintRect);
- //繪製邊框
- canvas.drawRect( mHorizontalPadding, mVerticalPadding,mHorizontalPadding+mWidth, mVerticalPadding+mWidth, mPaint);
- }
圓形裁剪稍複雜一點,利用到了Xfermode即圖像重疊模式中的XOR:摳出重疊區域
實現思路:
畫的有點亂,先湊合着看,2,3是用的另一個畫布,並將3即實心圓的畫筆設置爲:
- mPaintCirle.setXfermode(new PorterDuffXfermode(Mode.XOR));
當陰影層和其上部的的實心圓重疊時,則實心圓部分即被摳出,剩下一個中間空洞的陰影層了,然後再將該畫布的bitmap畫在自定義View的畫布上合成,最後畫出圓形裁剪區白色邊框,主要代碼如下:
- protected void onDraw(Canvas canvas)
- {
- super.onDraw(canvas);
- if(mBgBitmap==null){
- mBgBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
- mCanvas = new Canvas(mBgBitmap);
- mRect = new RectF(0, 0, getWidth(), getHeight());
- }
- //繪製陰影層
- mCanvas.drawRect(mRect, mPaintRect);
- //繪製實心圓 ,繪製完後,在mCanvas畫布中,mPaintRect和mPaintCirle相交部分即被掏空
- mCanvas.drawCircle( getWidth()/2, getHeight()/2, getWidth()/2-mHorizontalPadding, mPaintCirle);
- //將陰影層畫進本View的畫布中
- canvas.drawBitmap(mBgBitmap, null, mRect, new Paint());
- //繪製圓環
- canvas.drawCircle( getWidth()/2, getHeight()/2, getWidth()/2-mHorizontalPadding, mPaint);
- }
好了,且看源碼下載地址,兩個demo都包含在內: