Android BitmapShader 实战 实现圆形、圆角图片

参考资料:http://blog.csdn.net/lmj623565791/article/details/41967509

实现圆形ImageView 的方法总结:
一、利用BitmapShader完成圆形的图片:
思路:
1、就是利用Matrix来缩放图片,设置好Matrix后;
2、初始化BitmapShader,图片bitmap就是放在bitmapShader中的,然后bitmapShader.setLocalMatrix(matrix)来缩放图片的大小;
3、然后画笔bimapPaint.setShader(bitmapShader),就把图片及相关信息给了画笔;
4、最后canvas.drawCircle(…)就完成了圆形的ImageView。

 //获取图片
 bitmap = getBitmapFromDrawable(getDrawable());
 //图片的画笔
 bitmapPaint = new Paint();
 //参数值就代表 如果图片太小的话 就直接拉伸,TileMode.REPEAT参数代表 图片大小的话就重复放图片 TileMode.MIRROR就是镜像对着放图片的意思 跟大家设置pc 屏保时候其实是一样的
 bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

//缩放图片
 bitmapShader.setLocalMatrix(getBitmapMatrix());

 bitmapPaint.setAntiAlias(true);
 bitmapPaint.setShader(bitmapShader);

 //开始画圆形的图片
 canvas.save();

 //这里是计算圆的半径(视情况而定)
 float bitmapRadius = radius * outRingRadiusPercent - radius * ringWidthRadiusPercent / 2;

 //这行代码就是把imageview 切割成最终的圆形
 canvas.drawCircle(width / 2f, height / 2f, bitmapRadius, bitmapPaint);

canvas.restore();

缩放图片的方法

 /**
     * 缩放图片
     *
     * @return
     */
    private Matrix getBitmapMatrix() {

        int bitmapWidth = bitmap.getWidth();
        int bitmapHeight = bitmap.getHeight();

        float d = (radius * outRingRadiusPercent - radius * ringWidthRadiusPercent / 2) * 2;
        Matrix matrix = new Matrix();

        float scale = 1f;


        if (bitmapHeight > bitmapWidth) {
            scale = d / (float) bitmapWidth;
        } else {
            scale = d / (float) bitmapHeight;
        }

        matrix.setScale(scale, scale);

        return matrix;
    }

注意:
此方法实现的圆形ImageView中的图片的大小只能大于等于控件的大小,既当图片的高宽小于控件的高宽时,图片总是处于左上角的位置,不能居中,设置android:scaleTyel=”center”也不管用。

二、利用ShapeDrawable来实现
思路:
1、同样用Matrix和bitmapShader来进行图片的缩放;
2、利用ShapeDrawable 来控制图片的形状(圆形),及利用shapeDrawable.setBounds()来设置图片的位置;

/**
     * 画圆形图片
     *
     * @param canvas
     */
    private void drawBitmap(Canvas canvas) {

        //获取图片
        bitmap = getBitmapFromDrawable(getDrawable());

        //参数值就代表 如果图片太小的话 就直接拉伸,TileMode.REPEAT参数代表 图片大小的话就重复放图片 TileMode.MIRROR就是镜像对着放图片的意思 跟大家设置pc 屏保时候其实是一样的
        bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

        //缩放图片
        bitmapShader.setLocalMatrix(getBitmapMatrix());

        //OvalShape 表示椭圆,只要宽高一样,就是圆
        ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());

        //设置画笔的shader,进行图片的缩放
        shapeDrawable.getPaint().setShader(bitmapShader);

        //确定图片的位置,既当图片的宽高小于控件的宽高时
        int left = (int)(radius - (radius * outRingRadiusPercent - radius*ringWidthRadiusPercent/2));
        int top = left;
        int right = (int)(left + (radius * outRingRadiusPercent - radius*ringWidthRadiusPercent/2)*2);
        int bottom = right;
        shapeDrawable.setBounds(left,top,right,bottom);

        //画图
        shapeDrawable.draw(canvas);
    }

注意:
此方法就可以按照自己的意愿来控制图片显示的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值