Android:高仿QQ頭像截取升級版

       觀看此篇文章前,請先閱讀上篇文章:高仿QQ頭像截取

本篇之所以爲升級版,是在截取頭像界面添加了與qq類似的陰影層(裁剪區域以外的部分),且看效果圖:

 

爲了適應大家不同需求,這次打了兩個包,及上圖中一個方形的頭像截取demo和一個圓形的;

原理:

方形:


如圖:底層即圖片層,在上層的畫布中,先將裁剪區四周根據裁剪區大小畫上陰影,然後在畫上裁剪區的白色邊框(空心):如下圖


主要代碼如下:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Override  
  2.     protected void onDraw(Canvas canvas)  
  3.     {  
  4.         super.onDraw(canvas);  
  5.         // 計算矩形區域的寬度  
  6.         mWidth = getWidth() - 2 * mHorizontalPadding;  
  7.         // 計算距離屏幕垂直邊界 的邊距  
  8.         mVerticalPadding = (getHeight() - mWidth) / 2;  
  9.   
  10.         // 繪製左邊  
  11.         canvas.drawRect(0, 0, mHorizontalPadding, getHeight()-mVerticalPadding, mPaintRect);  
  12.         // 繪製右邊  
  13.         canvas.drawRect(getWidth() - mHorizontalPadding, mVerticalPadding, getWidth(),getHeight(), mPaintRect);  
  14.         // 繪製上邊  
  15.         canvas.drawRect(mHorizontalPadding, 0, getWidth(),mVerticalPadding, mPaintRect);  
  16.         // 繪製下邊  
  17.         canvas.drawRect(0, getHeight() - mVerticalPadding,getWidth() - mHorizontalPadding, getHeight(), mPaintRect);  
  18.           
  19.         //繪製邊框  
  20.         canvas.drawRect( mHorizontalPadding, mVerticalPadding,mHorizontalPadding+mWidth, mVerticalPadding+mWidth, mPaint);  
  21.           
  22.     }  
圓形:

圓形裁剪稍複雜一點,利用到了Xfermode即圖像重疊模式中的XOR:摳出重疊區域



實現思路:


畫的有點亂,先湊合着看,2,3是用的另一個畫布,並將3即實心圓的畫筆設置爲:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. mPaintCirle.setXfermode(new PorterDuffXfermode(Mode.XOR));  

當陰影層和其上部的的實心圓重疊時,則實心圓部分即被摳出,剩下一個中間空洞的陰影層了,然後再將該畫布的bitmap畫在自定義View的畫布上合成,最後畫出圓形裁剪區白色邊框,主要代碼如下:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. protected void onDraw(Canvas canvas)  
  2.     {  
  3.         super.onDraw(canvas);  
  4.         if(mBgBitmap==null){  
  5.             mBgBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);    
  6.             mCanvas = new  Canvas(mBgBitmap);  
  7.             mRect = new RectF(0, 0, getWidth(), getHeight());  
  8.         }  
  9.         //繪製陰影層  
  10.         mCanvas.drawRect(mRect, mPaintRect);  
  11.          //繪製實心圓 ,繪製完後,在mCanvas畫布中,mPaintRect和mPaintCirle相交部分即被掏空  
  12.         mCanvas.drawCircle( getWidth()/2, getHeight()/2, getWidth()/2-mHorizontalPadding, mPaintCirle);  
  13.          //將陰影層畫進本View的畫布中  
  14.         canvas.drawBitmap(mBgBitmap, null, mRect, new Paint());  
  15.       //繪製圓環  
  16.         canvas.drawCircle( getWidth()/2, getHeight()/2, getWidth()/2-mHorizontalPadding, mPaint);  
  17.           
  18.     }  

好了,且看源碼下載地址,兩個demo都包含在內:

http://download.csdn.net/detail/baiyuliang2013/8469585

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章