国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中ImageCropper矩形、圓形 裁剪框的實現方法

2019-10-21 21:44:33
字體:
來源:轉載
供稿:網友

前言

支持圓形裁剪框,裁剪后生成圓形圖案。

代碼基于開源項目修改,github上項目鏈接:https://github.com/shengge/android-crop

還是貼下效果圖:

Android,ImageCropper,矩形,圓形

Android,ImageCropper,矩形,圓形

說一下圓形裁剪實現部分:

1.UI方面,自定義CircleHighlightView繼承至HighlightView(原有的矩形裁剪框實現),直接看draw方法實現

@Override protected void draw(Canvas canvas) { canvas.save(); Path path = new Path(); outlinePaint.setStrokeWidth( outlineWidth); if(!hasFocus()) {//沒焦點是,直接畫一個黑色的矩形框  outlinePaint.setColor( Color.BLACK);  canvas.drawRect( drawRect, outlinePaint); } else {  Rect viewDrawingRect = new Rect();  viewContext.getDrawingRect( viewDrawingRect);   //已裁剪框drawRect,算出圓的半徑  float radius = (drawRect.right - drawRect.left) / 2;  //添加一個圓形  path.addCircle( drawRect.left + radius, drawRect.top + radius, radius, Direction.CW);  outlinePaint.setColor( highlightColor);   //裁剪畫布,path之外的區域,以outsidePaint填充  canvas.clipPath( path, Region.Op.DIFFERENCE);  canvas.drawRect( viewDrawingRect, outsidePaint);   canvas.restore();  //繪制圓上高亮線,這里outlinePaint定義的Paint.Style.STROKE:表示只繪制幾何圖形的輪廓。  canvas.drawPath( path, outlinePaint);    //當modifyMode為grow時,繪制handles,也就是那四個小圓  if(handleMode == HandleMode.Always || (handleMode == HandleMode.Changing && modifyMode == ModifyMode.Grow)) {  drawHandles( canvas);  } } }

這里就實現了畫圓形裁剪框的操作。

2. 響應和處理用戶觸摸事件

1). 判斷觸摸點坐標與圓的位置

/** * 根據x,y坐標,計算其與圓的關系(圓上、圓內、圓外) * @param x * @param y * @return */ private int getHitOnCircle(float x, float y) { Rect r = computeLayout(); int retval = GROW_NONE; final float hysteresis = 20F; int radius = (r.right - r.left) / 2;  int centerX = r.left + radius; int centerY = r.top + radius;  //判斷觸摸位置是否在圓上 float ret = (x - centerX) * (x - centerX) + (y - centerY) * (y - centerY); double rRadius = Math.sqrt( ret); double gap = Math.abs( rRadius - radius);  if(gap <= hysteresis) {// 圓上。這里由于是繼承至HighlightView(繪制矩形框的)來處理,所以模擬返回了左右上下,而非純圓上,親測可用。你也可以自定義。  if(x < centerX) {// left  retval |= GROW_LEFT_EDGE;  }  else {  retval |= GROW_RIGHT_EDGE;  }   if(y < centerY) {// up  retval |= GROW_TOP_EDGE;  }  else {  retval |= GROW_BOTTOM_EDGE;  } } else if(rRadius > radius) {// outside  retval = GROW_NONE; } else if(rRadius < radius) {// inside,圓內就執行move  retval = MOVE; }  return retval; }

由于是繼承至HighLightView(矩形框)來實現的,如果點(x,y)位置圓上,還需判斷其它那個象限,對應矩形的上下左右位置。

2).  移動裁剪框

若上一步判斷,觸摸點在圓內,就會返回MOVE,并處理移動過程。

// Grows the cropping rectangle by (dx, dy) in image space void moveBy(float dx, float dy) { Rect invalRect = new Rect(drawRect); //移動 cropRect.offset(dx, dy);  // Put the cropping rectangle inside image rectangle cropRect.offset(  Math.max(0, imageRect.left - cropRect.left),  Math.max(0, imageRect.top - cropRect.top));  cropRect.offset(  Math.min(0, imageRect.right - cropRect.right),  Math.min(0, imageRect.bottom - cropRect.bottom));  drawRect = computeLayout(); invalRect.union(drawRect); invalRect.inset(-(int) handleRadius, -(int) handleRadius); viewContext.invalidate(invalRect); }

移動裁剪框并保證其它image圖片顯示范圍內。

3). 縮放裁剪框

此過程和上一步類似,將cropRect矩陣進行等比縮放即可,這里就細說了,詳見代碼:HighLightView.growBy(float dx, float dy)

3.將裁剪圖片保存為圓形

/** * @param bitmap src圖片 * @return */ public static Bitmap getCircleBitmap(Bitmap bitmap) { Bitmap output = Bitmap.createBitmap( bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas( output);  final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect( 0, 0, bitmap.getWidth(), bitmap.getHeight());  paint.setAntiAlias( true); paint.setFilterBitmap( true); paint.setDither( true); canvas.drawARGB( 0, 0, 0, 0); paint.setColor( color); //在畫布上繪制一個圓 canvas.drawCircle( bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint); paint.setXfermode( new PorterDuffXfermode( Mode.SRC_IN)); canvas.drawBitmap( bitmap, rect, rect, paint); return output; }

注意:將bitmap保存為file時,格式請選擇png,不然會出現黑色背景。

鑒于水平有限,從小語文就沒學好,描述比較凌亂,需要深入理解的請閱讀源代碼。

附:另外一個很好開源項目 https://github.com/edmodo/cropper

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庄浪县| 集贤县| 谷城县| 金坛市| 三都| 黄骅市| 海南省| 安达市| 绥德县| 江津市| 扶余县| 武陟县| 楚雄市| 隆德县| 江源县| 固安县| 牙克石市| 修武县| 乌苏市| 曲松县| 宜都市| 岑巩县| 元谋县| 光山县| 开化县| 苏州市| 丹棱县| 原阳县| 治多县| 滁州市| 新闻| 九龙城区| 常德市| 隆德县| 德惠市| 建昌县| 依兰县| 宽甸| 黎平县| 泽州县| 天水市|