回覆列表
  • 1 # 使用者7278361049623

         將圖片變為圓形圖片,可以將系統ImageView替換成如下自定義 的view RoundImageView :   /**   * 圓形ImageView,可設定最多兩個寬度不同且顏色不同的圓形邊框。   *   * @author Alan   */   public class RoundImageView extends ImageView {   private int mBorderThickness = 0;   private Context mContext;   private int defaultColor = 0xFFFFFFFF;   // 如果只有其中一個有值,則只畫一個圓形邊框   private int mBorderOutsideColor = 0;   private int mBorderInsideColor = 0;   // 控制元件預設長、寬   private int defaultWidth = 0;   private int defaultHeight = 0;      public RoundImageView(Context context) {   super(context);   mContext = context;   }      public RoundImageView(Context context, AttributeSet attrs) {   super(context, attrs);   mContext = context;   setCustomAttributes(attrs);   }      public RoundImageView(Context context, AttributeSet attrs, int defStyle) {   super(context, attrs, defStyle);   mContext = context;   setCustomAttributes(attrs);   }      private void setCustomAttributes(AttributeSet attrs) {   TypedArray a = mContext.obtainStyledAttributes(attrs,   R.styleable.roundedimageview);   mBorderThickness = a.getDimensionPixelSize(   R.styleable.roundedimageview_border_thickness, 0);   mBorderOutsideColor = a   .getColor(R.styleable.roundedimageview_border_outside_color,   defaultColor);   mBorderInsideColor = a.getColor(   R.styleable.roundedimageview_border_inside_color, defaultColor);   }      @Override   protected void onDraw(Canvas canvas) {   Drawable drawable = getDrawable();   if (drawable == null) {   return;   }      if (getWidth() == 0 || getHeight() == 0) {   return;   }   this.measure(0, 0);   if (drawable.getClass() == NinePatchDrawable.class)   return;   Bitmap b = ((BitmapDrawable) drawable).getBitmap();   Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);   if (defaultWidth == 0) {   defaultWidth = getWidth();      }   if (defaultHeight == 0) {   defaultHeight = getHeight();   }   // 保證重新讀取圖片後不會因為圖片大小而改變控制元件寬、高的大小(針對寬、高為wrap_content佈局的imageview,但會導致margin無效)   // if (defaultWidth != 0 && defaultHeight != 0) {   // LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(   // defaultWidth, defaultHeight);   // setLayoutParams(params);   // }   int radius = 0;   if (mBorderInsideColor != defaultColor   && mBorderOutsideColor != defaultColor) {// 定義畫兩個邊框,分別為外圓邊框和內圓邊框   radius = (defaultWidth < defaultHeight ? defaultWidth   : defaultHeight) / 2 - 2 * mBorderThickness;   // 畫內圓   drawCircleBorder(canvas, radius + mBorderThickness / 2,   mBorderInsideColor);   // 畫外圓   drawCircleBorder(canvas, radius + mBorderThickness   + mBorderThickness / 2, mBorderOutsideColor);   } else if (mBorderInsideColor != defaultColor   && mBorderOutsideColor == defaultColor) {// 定義畫一個邊框   radius = (defaultWidth < defaultHeight ? defaultWidth   : defaultHeight) / 2 - mBorderThickness;   drawCircleBorder(canvas, radius + mBorderThickness / 2,   mBorderInsideColor);   } else if (mBorderInsideColor == defaultColor   && mBorderOutsideColor != defaultColor) {// 定義畫一個邊框   radius = (defaultWidth < defaultHeight ? defaultWidth   : defaultHeight) / 2 - mBorderThickness;   drawCircleBorder(canvas, radius + mBorderThickness / 2,   mBorderOutsideColor);   } else {// 沒有邊框   radius = (defaultWidth < defaultHeight ? defaultWidth   : defaultHeight) / 2;   }   Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);   canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight   / 2 - radius, null);   }      /**   * 獲取裁剪後的圓形圖片   *   * @param radius   * 半徑   */   public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {   Bitmap scaledSrcBmp;   int diameter = radius * 2;      // 為了防止寬高不相等,造成圓形圖片變形,因此擷取長方形中處於中間位置最大的正方形圖片   int bmpWidth = bmp.getWidth();   int bmpHeight = bmp.getHeight();   int squareWidth = 0, squareHeight = 0;   int x = 0, y = 0;   Bitmap squareBitmap;   if (bmpHeight > bmpWidth) {// 高大於寬   squareWidth = squareHeight = bmpWidth;   x = 0;   y = (bmpHeight - bmpWidth) / 2;   // 擷取正方形圖片   squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,   squareHeight);   } else if (bmpHeight < bmpWidth) {// 寬大於高   squareWidth = squareHeight = bmpHeight;   x = (bmpWidth - bmpHeight) / 2;   y = 0;   squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,   squareHeight);   } else {   squareBitmap = bmp;   }      if (squareBitmap.getWidth() != diameter   || squareBitmap.getHeight() != diameter) {   scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,   diameter, true);      } else {   scaledSrcBmp = squareBitmap;   }   Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),   scaledSrcBmp.getHeight(), Config.ARGB_8888);   Canvas canvas = new Canvas(output);      Paint paint = new Paint();   Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),   scaledSrcBmp.getHeight());      paint.setAntiAlias(true);   paint.setFilterBitmap(true);   paint.setDither(true);   canvas.drawARGB(0, 0, 0, 0);   canvas.drawCircle(scaledSrcBmp.getWidth() / 2,   scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2,   paint);   paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));   canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);   // bitmap回收(recycle導致在佈局檔案XML看不到效果)   // bmp.recycle();   // squareBitmap.recycle();   // scaledSrcBmp.recycle();   bmp = null;   squareBitmap = null;   scaledSrcBmp = null;   return output;   }      /**   * 邊緣畫圓   */   private void drawCircleBorder(Canvas canvas, int radius, int color) {   Paint paint = new Paint();   /* 去鋸齒 */   paint.setAntiAlias(true);   paint.setFilterBitmap(true);   paint.setDither(true);   paint.setColor(color);   /* 設定paint的 style 為STROKE:空心 */   paint.setStyle(Paint.Style.STROKE);   /* 設定paint的外框寬度 */   paint.setStrokeWidth(mBorderThickness);   canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);   }      }

  • 2 # 使用者7698895345900

    方法一:使用框架 ,這是直接使用圓形/圓角的ImageView

    方法二:使用圖片載入框架 ,這是使用正常的ImageView,在載入圖片的時候進行圓形/圓角處理。

    GlideApp.with(this).load("http://123.jpg").circleCrop().into(imageView)

    GlideApp.with(this).load("http://123.jpg").transform(new GlideRoundTransform(context, 10)).into(imageView)

  • 中秋節和大豐收的關聯?
  • 2019年做足療和瑜伽哪個有前景?