中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-22 05:44:19 來源:腳本之家 閱讀:246 作者:jiantaocd 欄目:移動開發

前言

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

代碼基于開源項目修改,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 (本地下載)

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通化县| 临海市| 丰镇市| 洛扎县| 大厂| 江门市| 洪湖市| 临夏市| 巴东县| 阿荣旗| 莱阳市| 仁布县| 九龙城区| 咸宁市| 中山市| 维西| 皮山县| 宁武县| 清水河县| 京山县| 南汇区| 包头市| 阿克陶县| 大方县| 景德镇市| 和龙市| 镇沅| 信丰县| 葵青区| 远安县| 麦盖提县| 新郑市| 五峰| 连云港市| 西和县| 武宁县| 青海省| 天柱县| 丹凤县| 都兰县| 广河县|