最近想实现QQ的圆形头像,网上有不少代码都能实现,但代码上的注释有点少,所以我这种新手理解起来有不少的困难,后来看到了慕课的教程,才有点理解。
自定义Drawable核心类就是draw() 这些效果都是在draw()中实现的
public class CircleDrawable extends Drawable {
//定义画笔
private Paint paint;
//定义图片的直径
private int mWidth;
//要画的图片
private Bitmap bitmap;
public CircleDrawable(Bitmap bitmap) {
// TODO Auto-generated constructor stub
this.bitmap = bitmap;
//图片 渲染器 及图片照 x和y 平铺
/*
*TileMode:(一共有三种)
CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色。
REPEAT :横向和纵向的重复渲染器图片,平铺。
MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。
*/
BitmapShader bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
//定于画笔
paint = new Paint();
paint.setAntiAlias(true);//图片的抗锯齿
paint.setShader(bitmapShader);//为画笔实质图片渲染器
//图片的直径为 图片长宽中较小的那边
mWidth = Math.min(bitmap.getWidth(), bitmap.getHeight());
}
@Override
public void draw(Canvas arg0) {
// TODO Auto-generated method stub
//前面是圆心 第三个参数是半径 最后是画笔
arg0.drawCircle(mWidth/2, mWidth/2, mWidth/2, paint);
}
//支持和窗口一样的透明度
@Override
public int getOpacity() {
// TODO Auto-generated method stub
return PixelFormat.TRANSLUCENT;
}
//设置画笔的透明度
@Override
public void setAlpha(int arg0) {
// TODO Auto-generated method stub
paint.setAlpha(arg0);
}
@Override
public void setColorFilter(ColorFilter arg0) {
// TODO Auto-generated method stub
paint.setColorFilter(arg0);
}
//以下是Drawable 的实际高度和宽度
@Override
public int getIntrinsicHeight() {
// TODO Auto-generated method stub
return mWidth;
}
@Override
public int getIntrinsicWidth() {
// TODO Auto-generated method stub
return mWidth;
}
}
这样画圆形图片的工具类就OK了
再在Activity中onCreate中使用工具类
@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //bitmapShaders = new BitmapShaders(this); setContentView(R.layout.circle_my_view); imageview = (ImageView) findViewById(R.id.myView_imageView); //imageView2 = (ImageView) findViewById(R.id.myView_RoundimageView);
}
下面的就是实现带圆的图片
和圆形图片的代码相类似 多了一个RectF 这是构造一个矩形的类 而setBounds(int left, int top, int right, int bottom)是一个回调方法public class RoundDrawable extends Drawable { private Paint paint; private RectF rectF; private Bitmap bitmap; private BitmapShader bitmapShader; public RoundDrawable(Bitmap bitmap) { // TODO Auto-generated constructor stub this.bitmap = bitmap; //图片渲染器 bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP); paint = new Paint(); paint.setAntiAlias(true); paint.setShader(bitmapShader); } @Override public void draw(Canvas arg0) { // TODO Auto-generated method stub arg0.drawRoundRect(rectF, 30, 30, paint); } @Override public int getOpacity() { // TODO Auto-generated method stub return PixelFormat.TRANSLUCENT; } @Override public void setAlpha(int arg0) { // TODO Auto-generated method stub paint.setAlpha(arg0); } @Override public void setColorFilter(ColorFilter arg0) { // TODO Auto-generated method stub paint.setColorFilter(arg0); } //Drawable 的实际高度和宽度 @Override public int getIntrinsicHeight() { // TODO Auto-generated method stub return bitmap.getHeight(); } @Override public int getIntrinsicWidth() { // TODO Auto-generated method stub return bitmap.getWidth(); } @Override public void setBounds(int left, int top, int right, int bottom) { // TODO Auto-generated method stub //super.setBounds(left, top, right, bottom); rectF = new RectF(left, top, right, bottom); } }
在Activity中和上面的圆形图片相同