import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;
import com.example.admin.listviewdemo.R;
public class newCircle extends View {
private Bitmap mSourceBitmap;
PorterDuffXfermode xfermode;
private Paint paint;
public newCircle(Context context) {
this(context, null);
init();
}
public newCircle(Context context, AttributeSet attrs) {
this(context, attrs, 0);
init();
}
public newCircle(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint=new Paint();
paint.setAntiAlias(true);//设置抗锯齿
paint.setStyle(Paint.Style.FILL);//设置填充样式
paint.setDither(true);//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
paint.setFilterBitmap(true);//加快显示速度,本设置项依赖于dither和xfermode的设置
xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);//绘制交集,显示上层
}
@Override
protected void onDraw(Canvas canvas) {
// 生成圆形Bitmap过程
mSourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.yyy);//从资源文件中解析获取Bitmap
/**
* 设置View的离屏缓冲。在绘图的时候新建一个“层”,所有的操作都在该层而不会影响该层以外的图像
* 必须设置,否则设置的PorterDuffXfermode会无效
*/
int sc=canvas.saveLayer(0,0,getWidth()*2,getHeight()*2,paint,Canvas.ALL_SAVE_FLAG);
Matrix matrix = new Matrix();
float xscal = getWidth()/(1.0f*mSourceBitmap.getWidth());
float yscal = getHeight()/(1.0f*mSourceBitmap.getHeight());
float scal = xscal<yscal?yscal:xscal;
matrix.setScale(scal, scal);
canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth(),paint);
paint.setXfermode(xfermode);
canvas.translate(-(mSourceBitmap.getWidth()*scal - getWidth())/2,-(mSourceBitmap.getHeight()*scal - getHeight())/2);
canvas.drawBitmap(mSourceBitmap,matrix,paint);
paint.setXfermode(null);
/**
* 还原画布,与canvas.saveLayer配套使用
*/
canvas.restoreToCount(sc);
}
}
自定义圆形头像(可多种形状)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、前言 最近项目里面需要用到多个seekbar并且需要显示不同的精度,于是参考了部分博客模仿华为的天气刻度盘添加...
- 转载请标明出处:http://www.aiuxian.com/article/p-1982467.html 接下来...
- 效果图: 使用: 2个类: CircleImageView类: package com.lzyi.tpm.util...