您的位置:首页 > 其它

自定义Drawable 实现圆形图片 和带圆角的图片

2016-11-16 20:56 399 查看
   最近想实现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中使用工具类@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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);
 }
下面的就是实现带圆的图片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 stubthis.bitmap = bitmap;//图片渲染器bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);paint = new Paint();paint.setAntiAlias(true);paint.setShader(bitmapShader);}@Overridepublic void draw(Canvas arg0) {// TODO Auto-generated method stubarg0.drawRoundRect(rectF, 30, 30, paint);}@Overridepublic int getOpacity() {// TODO Auto-generated method stubreturn PixelFormat.TRANSLUCENT;}@Overridepublic void setAlpha(int arg0) {// TODO Auto-generated method stubpaint.setAlpha(arg0);}@Overridepublic void setColorFilter(ColorFilter arg0) {// TODO Auto-generated method stubpaint.setColorFilter(arg0);}//Drawable 的实际高度和宽度@Overridepublic int getIntrinsicHeight() {// TODO Auto-generated method stubreturn bitmap.getHeight();}@Overridepublic int getIntrinsicWidth() {// TODO Auto-generated method stubreturn bitmap.getWidth();}@Overridepublic 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);}}和圆形图片的代码相类似 多了一个RectF 这是构造一个矩形的类  而setBounds(int left, int top, int right, int bottom)是一个回调方法 在Activity中和上面的圆形图片相同
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: