Android 圆角图片 圆形图片

实现圆角图片

方法1:自定义view继承自Drawable

public class RoundDrawable extends Drawable {

    private Paint paint;
    private Bitmap bitmap;
    private RectF rectF;

    public RoundDrawable(Bitmap bitmap) {
        this.bitmap = bitmap;
        paint = new Paint();
        paint.setAntiAlias(true);
        BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setShader(shader);
        rectF = new RectF(0,0,bitmap.getWidth()/2,bitmap.getHeight()/2);
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        canvas.drawRoundRect(rectF,30,30,paint);
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        super.setBounds(left, top, right, bottom);
        rectF.set(left,top,right,bottom);
    }

    @Override
    public void setAlpha(int i) {
        paint.setAlpha(i);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        paint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

使用方法:imagView设置drawable

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.win);
        iv1.setImageDrawable(new RoundDrawable(bitmap));

 

方式2:自定义view继承自ImagView

public class RoundImageView extends AppCompatImageView {
    private Paint paint;
    private int width;
    private int height;
    private int radius = 30;
    private int shapeType; //0默认 1圆形 2方形
    public RoundImageView(Context context) {
        super(context);
        init(context,null);

    }

    public RoundImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public RoundImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    private void init(Context context,AttributeSet attris) {
        //获取xml设置的属性值
        if (attris != null) {
            TypedArray array = context.obtainStyledAttributes(attris, R.styleable.myRoundImageViewStyle);
            radius = array.getDimensionPixelOffset(R.styleable.myRoundImageViewStyle_radius,radius);
            shapeType = array.getInteger(R.styleable.myRoundImageViewStyle_shape,0);
            Log.d("test","----radius="+radius+"--shapeType="+shapeType);
            array.recycle();
        }
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(0xffffffff);
        setDrawingCacheEnabled(true);
        setWillNotDraw(false);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (shapeType == 0) {
            super.onDraw(canvas);
            return;
        }
        Drawable drawable = getDrawable();
        if (drawable == null) {
            return;
        }
        width = getWidth();
        height = getHeight();
        if (getWidth() == 0 || getHeight() == 0) {
            return;
        }
        Bitmap bitmap = getBitMapFromView(drawable);
        drawBitMap(canvas,bitmap);
    }

    public Bitmap getBitMapFromView(Drawable drawable) {
        Bitmap bitmap;
        try {
            if (drawable instanceof BitmapDrawable) {
                return ((BitmapDrawable) drawable).getBitmap();
            } else if (drawable instanceof ColorDrawable) {
                bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
            } else {
                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
            }
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            return bitmap;
        }catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @SuppressLint("WrongConstant")
    private void drawBitMap(Canvas canvas, Bitmap bitmap) {
        //叠加模式 底层方形图像,上层圆形,则显示圆形区域
        PorterDuffXfermode porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
        int saveFlags = Canvas.MATRIX_SAVE_FLAG
                | Canvas.CLIP_SAVE_FLAG
                | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
                | Canvas.FULL_COLOR_LAYER_SAVE_FLAG
                | Canvas.CLIP_TO_LAYER_SAVE_FLAG;
        canvas.saveLayer(0, 0, width, height, null, saveFlags);
        if (shapeType == 1) { //画圆
            canvas.drawCircle(width/2,height/2,height/2 -1,paint);
        } else if (shapeType == 2) {
            RectF rect = new RectF(1,1,getWidth()-1,getHeight()-1);
            canvas.drawRoundRect(rect,radius+1,radius+1,paint);
        }
        paint.setXfermode(porterDuffXfermode);
        // 空间的大小 / bitmap 的大小 = bitmap 缩放的倍数
        float scaleWidth = ((float) getWidth()) / bitmap.getWidth();
        float scaleHeight = ((float) getHeight()) / bitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        //bitmap 缩放
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        canvas.drawBitmap(bitmap,0,0,paint);
        canvas.restore();
    }
}

使用方法:先定义需要的属性

在values文件下新建resource资源文件attrs

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="myRoundImageViewStyle">
        <attr name="radius" format="dimension"/>
        <attr name="shape" format="enum">
            <enum name="none" value="0"/>
            <enum name="round" value="1"/>
            <enum name="rectangle" value="2"/>
        </attr>
    </declare-styleable>
</resources>

在xml文件里面引入自定义view

 

两种圆角方式,根据需要选取

******************************************

另外,最新的Glide可以显示圆角图片

使用方法:设定圆角值

RequestOptions options = new RequestOptions().transform(new CenterCrop(),new RoundedCorners(30));

加载图片

Glide.with(context)
                .load(url)
                .placeholder(R.mipmap.default)
                .error(R.mipmap.default)
                .apply(options)
                .into(iv);

 

 

 

 

 

 

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值