android view的绘制原理,关于圆形android圆形view的绘制原理

public class CircleImageView extends ImageView {

public CircleImageView(Context context, AttributeSet attrs,

int defStyle) {

super(context, attrs, defStyle);

init();

}

public CircleImageView(Context context, AttributeSet attrs)

{

super(context, attrs);

init();

}

public CircleImageView(Context context) {

super(context);

init();

}

private Bitmap bitmap;

private Rect bitmapRect = new Rect();

private PaintFlagsDrawFilter pdf = new PaintFlagsDrawFilter(0,

Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);

private Paint paint = new Paint();

{

paint.setStyle(Paint.Style.STROKE);

paint.setFlags(Paint.ANTI_ALIAS_FLAG);

paint.setAntiAlias(true);

}

private Bitmap mDstB = null;

private PorterDuffXfermode xfermode = new

PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);

private void init() {

try {

if (android.os.Build.VERSION.SDK_INT >= 11) {

setLayerType(LAYER_TYPE_SOFTWARE, null);

}

} catch (Exception e) {

e.printStackTrace();

}

}

public void setImageBitmap(Bitmap bitmap) {

this.bitmap = bitmap;

}

private Bitmap makeDst(int w, int h) {

Bitmap bm = Bitmap.createBitmap(w, h,

Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(bm);

Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

p.setColor(Color.parseColor("#ffffffff"));

c.drawOval(new RectF(0, 0, w, h), p);

return bm;

}

@Override

protected void onDraw(Canvas canvas) {

if (null == bitmap) {

return;

}

if (null == mDstB) {

mDstB = makeDst(getWidth(), getHeight());

}

bitmapRect.set(0, 0, getWidth(), getHeight());

canvas.save();

canvas.setDrawFilter(pdf);

canvas.drawBitmap(mDstB, 0, 0, paint);

paint.setXfermode(xfermode);

canvas.drawBitmap(bitmap, null, bitmapRect, paint);

paint.setXfermode(null);

canvas.restore();

}

}

这是一段摘自网上的圆形view的处理手段,传入一张bitmap绘制出圆形.

private PorterDuffXfermode

xfermode = new

PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);

xfermode属性是一个关键属性,他的作用是当在目标canvas绘制多个图层时,取多个图层交集部分叠加后颜色.

mDstB = makeDst()方法中的drawOval是绘制一个圆形(特殊椭圆)

颜色为ffffffff纯透明, 这样一个透明的圆形图层(mDstB)就产生了.

接下来绘制图层 canvas.drawBitmap(mDstB, 0, 0,

paint);

设置多图层呈相规则 paint.setXfermode(xfermode);

接着绘制需要处理的bitmap  canvas.drawBitmap(bitmap,

null, bitmapRect, paint);

canvas.drawBitmap(bt,

src, dst,paint);

bt =

需要处理的bitmap

src

=Rect对象, 可以为null.

此参数作用是截取原bitmap

dst = Rect对象, 次参数作用最终的图像显示的坐标,和图片的宽高. 取决于new Rect时传递的参数

paint = Paint对象 设置了xfermode 的属性的画笔

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值