Canvas简单使用

给选定的图片加一个遮罩层,只显示绘制的圆形区域,其它部分透明,

但控件大小还是原图尺寸,

这种剪切模式仅适用于bitmap的绘制,直接用canvas绘制的形状不可以用。(形状和bitmap混用也可以)

 

classCommViewextendsView{

privatePaintmPaint;

publicCommView(Contextcontext){

super(context);

setFocusable(true);

 

mPaint=newPaint();

mPaint.setAntiAlias(true);

}

 

@Override

protectedvoidonDraw(Canvascanvas){

super.onDraw(canvas);

canvas.drawColor(Color.WHITE);//设画布白色

canvas.translate(20,20);//移动画布

//原始图片

Bitmapsrc=BitmapFactory.decodeResource(getResources(),R.drawable.aaa);

intwidth=src.getWidth();

intheigh=src.getHeight();

 

//图片的遮罩(搞一个和原图一样大的空白bitmap)

Bitmapmask=Bitmap.createBitmap(width,heigh,src.getConfig());

Canvascc=newCanvas(mask);

 

cc.drawCircle(width/2,heigh/2,width/2-10,mPaint);

/*

*离屏缓存

*Layer层的宽和高要设定好,不然会出现有些部位不再层里面,你的操作是不对这些部位起作用的

*/

intsc=canvas.saveLayer(0,0,width,heigh,null,Canvas.ALL_SAVE_FLAG);

//先绘制dis目标图

canvas.drawBitmap(src,0,0,mPaint);

//设置混合模式(只在源图像和目标图像相交的地方绘制目标图像)

mPaint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.DST_IN));

//再绘制src源图

canvas.drawBitmap(mask,0,0,mPaint);

//还原混合模式

mPaint.setXfermode(null);

//还原画布

canvas.restoreToCount(sc);

}

}

 

 

下面是更简单的方法,直接裁剪canvas为圆形

/**

 * 圆形imageview

 * Created by wwf on 2017/4/7.

 */

 

@SuppressLint("AppCompatCustomView")

public class CircleImageView extends ImageView {

    int radio;

 

    public CircleImageView(Context context, @Nullable AttributeSet attrs) {

        super(context, attrs);

    }

 

    @Override

    protected void onDraw(Canvas canvas) {

        radio = getWidth() < getHeight() ? getWidth()/2 : getHeight()/2;

        Path path = new Path();

        path.addCircle(getWidth()/2, getHeight()/2, radio, Path.Direction.CCW);

        canvas.clipPath(path, Region.Op.INTERSECT);

        super.onDraw(canvas);

    }

}

转载于:https://my.oschina.net/u/3500121/blog/907525

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值