一、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.
}