CustomImageView圆形imageView, 支持xutils加载

package com.beidaivf.aibaby.myview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.beidaivf.aibaby.R;

/**
 * 图片圆角实现,支持xUtils
 * 
 * @author Himan
 * 
 */
public class CustomImageView extends ImageView {
   private Paint paint;
   private Paint paintBorder;

   public CustomImageView(final Context context) {
      this(context, null);
   }

   public CustomImageView(Context context, AttributeSet attrs) {
      this(context, attrs, R.attr.customImageViewStyle);
   }

   public CustomImageView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      this.setScaleType(ScaleType.FIT_XY);
      TypedArray ta = context.obtainStyledAttributes(attrs,
            R.styleable.CustomImageView, defStyle, 0);
      mRadius = ta.getDimension(R.styleable.CustomImageView_radius, 0);
      mIsCircle = ta.getBoolean(R.styleable.CustomImageView_circle, false);
      ta.recycle();
      paint = new Paint();
      paint.setAntiAlias(true);
      paintBorder = new Paint();
      paintBorder.setAntiAlias(true);
   }

   public void addShadow() {
      setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
      paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK);

   }

   private float mRadius;
   private boolean mIsCircle;

   @Override
   public void onDraw(Canvas canvas) {
      int width = canvas.getWidth() - getPaddingLeft() - getPaddingRight();
      int height = canvas.getHeight() - getPaddingTop() - getPaddingBottom();
      Bitmap image = drawableToBitmap(getDrawable());
      Bitmap reSizeImage = reSizeImage(image, width, height);
      if (mIsCircle) {
         canvas.drawBitmap(createCircleImage(reSizeImage, width, height),
               getPaddingLeft(), getPaddingTop(), null);

      } else {
         canvas.drawBitmap(createRoundImage(reSizeImage, width, height),
               getPaddingLeft(), getPaddingTop(), null);
      }
   }

   private Bitmap createRoundImage(Bitmap source, int width, int height) {
      final Paint paint = new Paint();
      paint.setAntiAlias(true);
      Bitmap target = Bitmap.createBitmap(width, height, Config.ARGB_8888);
      Canvas canvas = new Canvas(target);
      RectF rect = new RectF(0, 0, width, height);
      canvas.drawRoundRect(rect, mRadius, mRadius, paint);
      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
      canvas.drawBitmap(source, 0, 0, paint);
      return target;
   }

   private Bitmap createCircleImage(Bitmap source, int width, int height) {
      final Paint paint = new Paint();
      paint.setAntiAlias(true);
      Bitmap target = Bitmap.createBitmap(width, height, Config.ARGB_8888);
      Canvas canvas = new Canvas(target);
      canvas.drawCircle(width / 2, height / 2, Math.min(width, height) / 2,
            paint);
      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
      canvas.drawBitmap(source, 0, 0, paint);
      return target;
   }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      int width = MeasureSpec.getSize(widthMeasureSpec);
      int height = MeasureSpec.getSize(heightMeasureSpec);
      setMeasuredDimension(width, height);
   }

   /**
    * drawablebitmap
    * 
    * @param drawable
    * @return
    */
   private Bitmap drawableToBitmap(Drawable drawable) {
      if (drawable == null) {
         return null;
      } else if (drawable instanceof BitmapDrawable) {
         return ((BitmapDrawable) drawable).getBitmap();
      }
      Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicHeight(),
            drawable.getIntrinsicHeight(), Config.ARGB_8888);
      Canvas canvas = new Canvas(bitmap);
      drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
      drawable.draw(canvas);
      return bitmap;
   }

   /**
    * 重设Bitmap的宽高
    * 
    * @param bitmap
    * @param newWidth
    * @param newHeight
    * @return
    */
   private Bitmap reSizeImage(Bitmap bitmap, int newWidth, int newHeight) {
      int width = bitmap.getWidth();
      int height = bitmap.getHeight();
      // 计算出缩放比
      float scaleWidth = ((float) newWidth) / width;
      float scaleHeight = ((float) newHeight) / height;
      // 矩阵缩放bitmap
      Matrix matrix = new Matrix();
      matrix.postScale(scaleWidth, scaleHeight);
      return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
   }

}
 
 
下面是xml代码:*app:circle="true"*设置为圆角属性
 
	
<com.beidaivf.aibaby.myview.CustomImageView
    android:id="@+id/doctor_list_img"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="14dp"
    android:layout_marginTop="16dp"
    android:src="@drawable/tx1"
    app:circle="true" />
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值