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

   最近想实现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);

}




下面的就是实现带圆的图片


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);
	}
}
和圆形图片的代码相类似 多了一个RectF 这是构造一个矩形的类  而setBounds(int left, int top, int right, int bottom)是一个回调方法 


在Activity中和上面的圆形图片相同




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值