DreamSea

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Rounded corner bitmaps on Android

public class RoundedCornerImageView extends ImageView {

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

@Override
protected void onDraw(Canvas canvas) {
// Round some corners betch!
Drawable maiDrawable = getDrawable();
float mCornerRadius = 6 * getContext().getResources().getDisplayMetrics().density;
if (maiDrawable instanceof BitmapDrawable && mCornerRadius > 0) {
Paint paint = ((BitmapDrawable) maiDrawable).getPaint();
final int color = 0xff000000;

final RectF rectF = new RectF(0,0,getWidth(),getHeight());
// Create an off-screen bitmap to the PorterDuff alpha blending to work right
int saveCount = canvas.saveLayer(rectF, null,
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);


paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, mCornerRadius, mCornerRadius, paint);

Xfermode oldMode = paint.getXfermode();
// This is the paint already associated with the BitmapDrawable that super draws
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
super.onDraw(canvas);
paint.setXfermode(oldMode);
canvas.restoreToCount(saveCount);
} else {
super.onDraw(canvas);
}
}

}

注意:在GridView中的Item 为ImageView设置为圆角过程中,在没添加红色部分时,看不到圆角效果,但是如果用鼠标在屏幕上轻触拖动确显示出圆角

        为什么呢?

参考:

ApiDemos示例解析(86):Graphics->Xfermodes http://www.imobilebbs.com/wordpress/?p=1657
使用PorterDuffXfermode实现遮罩层 http://lonesane.iteye.com/blog/791267

Android --- 图片的特效处理

http://www.oschina.net/question/54100_33464

posted on 2012-05-24 15:47  DreamSea  阅读(1493)  评论(0编辑  收藏  举报