一、相关概念
1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象
2、Canvas画布,绘图的目的区域,用于绘图
3、Bitmap位图,用于图的处理
4、Matrix矩阵
二、Bitmap
1、从资源中获取Bitmap
- Resourcesres=getResources();
- Bitmapbmp=BitmapFactory.decodeResource(res,R.drawable.icon);
2、Bitmap → byte[]
- publicbyte[]Bitmap2Bytes(Bitmapbm){
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- bm.compress(Bitmap.CompressFormat.PNG,100,baos);
- returnbaos.toByteArray();
- }
3、byte[] → Bitmap
- publicBitmapBytes2Bimap(byte[]b){
- if(b.length!=0){
- returnBitmapFactory.decodeByteArray(b,0,b.length);
- }else{
- returnnull;
- }
- }
4、Bitmap缩放
- publicstaticBitmapzoomBitmap(Bitmapbitmap,intwidth,intheight){
- intw=bitmap.getWidth();
- inth=bitmap.getHeight();
- Matrixmatrix=newMatrix();
- floatscaleWidth=((float)width/w);
- floatscaleHeight=((float)height/h);
- matrix.postScale(scaleWidth,scaleHeight);
- Bitmapnewbmp=Bitmap.createBitmap(bitmap,0,0,w,h,matrix,true);
- returnnewbmp;
- }
5、将Drawable转化为Bitmap
- publicstaticBitmapdrawableToBitmap(Drawabledrawable){
- //取drawable的长宽
- intw=drawable.getIntrinsicWidth();
- inth=drawable.getIntrinsicHeight();
- //取drawable的颜色格式
- Bitmap.Configconfig=drawable.getOpacity()!=PixelFormat.OPAQUE?Bitmap.Config.ARGB_8888
- :Bitmap.Config.RGB_565;
- //建立对应bitmap
- Bitmapbitmap=Bitmap.createBitmap(w,h,config);
- //建立对应bitmap的画布
- Canvascanvas=newCanvas(bitmap);
- drawable.setBounds(0,0,w,h);
- //把drawable内容画到画布中
- drawable.draw(canvas);
- returnbitmap;
- }
6、获得圆角图片
- publicstaticBitmapgetRoundedCornerBitmap(Bitmapbitmap,floatroundPx){
- intw=bitmap.getWidth();
- inth=bitmap.getHeight();
- Bitmapoutput=Bitmap.createBitmap(w,h,Config.ARGB_8888);
- Canvascanvas=newCanvas(output);
- finalintcolor=0xff424242;
- finalPaintpaint=newPaint();
- finalRectrect=newRect(0,0,w,h);
- finalRectFrectF=newRectF(rect);
- paint.setAntiAlias(true);
- canvas.drawARGB(0,0,0,0);
- paint.setColor(color);
- canvas.drawRoundRect(rectF,roundPx,roundPx,paint);
- paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
- canvas.drawBitmap(bitmap,rect,rect,paint);
- returnoutput;
- }
7、获得带倒影的图片
- publicstaticBitmapcreateReflectionImageWithOrigin(Bitmapbitmap){
- finalintreflectionGap=4;
- intw=bitmap.getWidth();
- inth=bitmap.getHeight();
- Matrixmatrix=newMatrix();
- matrix.preScale(1,-1);
- BitmapreflectionImage=Bitmap.createBitmap(bitmap,0,h/2,w,
- h/2,matrix,false);
- BitmapbitmapWithReflection=Bitmap.createBitmap(w,(h+h/2),
- Config.ARGB_8888);
- Canvascanvas=newCanvas(bitmapWithReflection);
- canvas.drawBitmap(bitmap,0,0,null);
- PaintdeafalutPaint=newPaint();
- canvas.drawRect(0,h,w,h+reflectionGap,deafalutPaint);
- canvas.drawBitmap(reflectionImage,0,h+reflectionGap,null);
- Paintpaint=newPaint();
- LinearGradientshader=newLinearGradient(0,bitmap.getHeight(),0,
- bitmapWithReflection.getHeight()+reflectionGap,0x70ffffff,
- 0x00ffffff,TileMode.CLAMP);
- paint.setShader(shader);
- //SettheTransfermodetobeporterduffanddestinationin
- paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN));
- //Drawarectangleusingthepaintwithourlineargradient
- canvas.drawRect(0,h,w,bitmapWithReflection.getHeight()
- +reflectionGap,paint);
- returnbitmapWithReflection;
- }
三、Drawable
1、Bitmap转换成Drawable
- Bitmapbm=xxx;//xxx根据你的情况获取
- BitmapDrawablebd=newBitmapDrawable(getResource(),bm);
- 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
2、Drawable缩放
- publicstaticDrawablezoomDrawable(Drawabledrawable,intw,inth){
- intwidth=drawable.getIntrinsicWidth();
- intheight=drawable.getIntrinsicHeight();
- //drawable转换成bitmap
- Bitmapoldbmp=drawableToBitmap(drawable);
- //创建操作图片用的Matrix对象
- Matrixmatrix=newMatrix();
- //计算缩放比例
- floatsx=((float)w/width);
- floatsy=((float)h/height);
- //设置缩放比例
- matrix.postScale(sx,sy);
- //建立新的bitmap,其内容是对原bitmap的缩放后的图
- Bitmapnewbmp=Bitmap.createBitmap(oldbmp,0,0,width,height,
- matrix,true);
- returnnewBitmapDrawable(newbmp);
- }