将矩形图片转换成圆形图片-圆角图片 任意控制

功能:点击按钮将一张矩形的图片裁剪为圆形的图片,圆形图片为矩形的内切圆

 //按钮的单击事件
    public  void btnClick(View view){
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);//需要转变的图片
        Bitmap afterBitmap = new CircleBitmap().getBitmap(bitmap);//裁剪为圆形后的位图
        imageView.setImageBitmap(afterBitmap);
    }

上面使用到的工具类:

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;

/**
 * 将矩形图片变为圆形的工具类
 */
public class CircleBitmap  {

    public Bitmap getBitmap(Bitmap source) {
        //我这里是得到bitmap宽与高的最小值,然后作为圆的半径  
        int min = source.getHeight()>source.getWidth()?source.getWidth():source.getHeight();
        return createCircleImage(source,min);
    }

    /**
     * 创建圆形图片的一个方法
     * @param source  需要转变成圆形的bitmap图片
     * @param min  圆形bitmap的半径
     * @return 返回变换好的圆形bitmap
     */
    private Bitmap createCircleImage(Bitmap source, int min)
    {
        final Paint paint = new Paint();
        paint.setAntiAlias(true);
        Bitmap target = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
        /**
         * 产生一个同样大小的画布
         */
        Canvas canvas = new Canvas(target);
        /**
         * 首先绘制圆形
         */
        canvas.drawCircle(min / 2, min / 2, min / 2, paint);
        /**
         * 使用SRC_IN  交互
         */
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        /**
         * 绘制图片
         */
        canvas.drawBitmap(source, 0, 0, paint);
        return target;
    }

}

效果图: 左边为之前的,右边为裁剪后的

 

圆角形图片,并可以控制圆弧的角度:(在画布上动刀)

public class RoundCornerImageView extends ImageView {

    public RoundCornerImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private int angle;

    @Override
    protected void onDraw(Canvas canvas) {
        Path clipPath = new Path();
        int w = this.getWidth();
        int h = this.getHeight();
        if(angle != 0){
            //图片左上与左下角为圆弧形状,右上与右下的弧度为0
            clipPath.addRoundRect(new RectF(0, 0, w, h),
                    new float[]{angle, angle, 0, 0,
                                0, 0, angle, angle},
                    Path.Direction.CW);
            /*new float[]{leftTopRadius, leftTopRadius, rightTopRadius, rightTopRadius,
                    rightBottomRadius, rightBottomRadius, leftBottomRadius, leftBottomRadius},*/
        }else{
            clipPath.addRoundRect(new RectF(0, 0, w, h), 14.0f, 14.0f, Path.Direction.CW);//四个角都为圆弧形
        }
        canvas.clipPath(clipPath);
        super.onDraw(canvas);
    }

    /**
     * 圆角 左边为圆弧  右边为直角
     * @param angle
     */
    public void setAngle(int angle){
        this.angle = angle;
        invalidate();
    }
}

使用与效果图:

setAngle(UnitConversionUtils.dip2px(TipsActivity.this,8)

Glide.with(TipsActivity.this)
                    .load(datas.get(position).getImgUrl())
                    .asBitmap()
                    .placeholder(R.mipmap.default_image2)
                    .error(R.mipmap.default_image2)
                    .centerCrop()
                    .into(viewHolder.iv_itemtip_img);

 灰色线忽略不看(背景图而已)

 

posted @ 2016-09-28 21:02  ts-android  阅读(1142)  评论(0编辑  收藏  举报