一、Drawable相关概念



1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象



2、Canvas画布,绘图的目的区域,用于绘图



3、Bitmap位图,用于图的处理



4、Matrix矩阵



二、Bitmap

1、从资源中获取Bitmap

1.  
 Resources res = getResources();  2.  
 Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);   
 
  
2、Bitmap → byte[]
 
 
 
  
1.  
public byte[] Bitmap2Bytes(Bitmap bm) {  2.  
     ByteArrayOutputStream baos = new3.  
     bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  4.  
     return5.  
 }   
 
 3、byte[] → Bitmap
 
 
 
  
1.  
public Bitmap Bytes2Bimap(byte[] b) {  2.  
     if (b.length != 0) {  3.  
         return BitmapFactory.decodeByteArray(b, 0, b.length);  4.  
     } else5.  
         return null;  6.  
     }  7.  
 }   
 
4、Bitmap缩放
 
 
 
  
1.  
public static Bitmap zoomBitmap(Bitmap bitmap, int width, int2.  
     int3.  
     int4.  
     Matrix matrix = new5.  
     float scaleWidth = ((float) width / w);  6.  
     float scaleHeight = ((float) height / h);  7.  
     matrix.postScale(scaleWidth, scaleHeight);  8.  
     Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);  9.  
     return10.  
 }   
 
  5、将Drawable转化为Bitmap
 
 
 
  
1.  
public static2.  
         // 取 drawable 的长宽3.  
         int4.  
         int5.  
   6.  
         // 取 drawable 的颜色格式7.  
         Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  8.  
                 : Bitmap.Config.RGB_565;  9.  
         // 建立对应 bitmap10.  
         Bitmap bitmap = Bitmap.createBitmap(w, h, config);  11.  
         // 建立对应 bitmap 的画布12.  
         Canvas canvas = new13.  
         drawable.setBounds(0, 0, w, h);  14.  
         // 把 drawable 内容画到画布中15.  
         drawable.draw(canvas);  16.  
         return17.  
     }   
 
6、获得圆角图片 
 
 
 
  
1.  
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float2.  
     int3.  
     int4.  
     Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);  5.  
     Canvas canvas = new6.  
     final int color = 0xff424242;  7.  
     final Paint paint = new8.  
     final Rect rect = new Rect(0, 0, w, h);  9.  
     final RectF rectF = new10.  
     paint.setAntiAlias(true);  11.  
     canvas.drawARGB(0, 0, 0, 0);  12.  
     paint.setColor(color);  13.  
     canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  14.  
     paint.setXfermode(new15.  
     canvas.drawBitmap(bitmap, rect, rect, paint);  16.  
   17.  
     return18.  
 }   
 
 7、获得带倒影的图片
 
 
 
  
1.  
public static2.  
     final int reflectionGap = 4;  3.  
     int4.  
     int5.  
   6.  
     Matrix matrix = new7.  
     matrix.preScale(1, -1);  8.  
   9.  
     Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w,  10.  
             h / 2, matrix, false);  11.  
   12.  
     Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2),  13.  
             Config.ARGB_8888);  14.  
   15.  
     Canvas canvas = new16.  
     canvas.drawBitmap(bitmap, 0, 0, null);  17.  
     Paint deafalutPaint = new18.  
     canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);  19.  
   20.  
     canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);  21.  
   22.  
     Paint paint = new23.  
     LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,  24.  
             bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,  25.  
             0x00ffffff, TileMode.CLAMP);  26.  
     paint.setShader(shader);  27.  
     // Set the Transfer mode to be porter duff and destination in28.  
     paint.setXfermode(new29.  
     // Draw a rectangle using the paint with our linear gradient30.  
     canvas.drawRect(0, h, w, bitmapWithReflection.getHeight()  31.  
             + reflectionGap, paint);  32.  
   33.  
     return34.  
 }   
 
1、Bitmap转换成Drawable
 
 
 
  
1.  
 Bitmap bm=xxx; //xxx根据你的情况获取2.  
 BitmapDrawable bd= new3.  
 因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。   
 
2、Drawable缩放
 
 
 
  
1.  
public static Drawable zoomDrawable(Drawable drawable, int w, int2.  
     int3.  
     int4.  
     // drawable转换成bitmap5.  
     Bitmap oldbmp = drawableToBitmap(drawable);  6.  
     // 创建操作图片用的Matrix对象7.  
     Matrix matrix = new8.  
     // 计算缩放比例9.  
     float sx = ((float) w / width);  10.  
     float sy = ((float) h / height);  11.  
     // 设置缩放比例12.  
     matrix.postScale(sx, sy);  13.  
     // 建立新的bitmap,其内容是对原bitmap的缩放后的图14.  
     Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,  15.  
             matrix, true);  16.  
     return new17.  
 }