总体思路如下:
(1)使用canvas先画一层形状层,即最后是要图片裁剪成神马样的
(2)再将paint做如下设置(画两层则取上层和下层的交叉部分,显示上层)
paint.setXfermode(new PorterDuffXfermode(Mode. SRC_IN));
具体这句话是做什么请看:http://407827531.iteye.com/blog/1470519
(3)再使用canvas将图片画进去
(4)canvas的输出的bitmap就是需要的东西啦
关键:如何将.9.png转换成bitmap对象呢?
代码如下:
NinePatchDrawable drawable = (NinePatchDrawable) mContext .getResources().getDrawable(R.drawable. my_shape);
drawable.setBounds(rect);
Bitmap first = Bitmap. createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Config. ARGB_8888);
Canvas newCanvas = new Canvas(first);
drawable.draw(newCanvas);
my_shape.9.png是一张背景透明的有一个特定形状的图形的.9图
最后
整个函数的代码如下:
public static Bitmap getShapedBitmap(Context context, Bitmap bitmap, int pixels) {
try {
Bitmap output = Bitmap. createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Config. ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
NinePatchDrawable drawable = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.my_shape);
drawable.setBounds(rect);
Bitmap first = Bitmap. createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Config. ARGB_8888);
Canvas newCanvas = new Canvas(first);
drawable.draw(newCanvas);
paint.setAntiAlias( true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color. BLACK);
// canvas.drawRoundRect(rectF, roundPx, roundPx, paint);//若想切成圆角矩形,则用这句话
canvas.drawBitmap(first, rect, rectF, paint);//切成特定的形状
paint.setXfermode( new PorterDuffXfermode(Mode. SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
} catch (Exception e) {
return null;
}
}
个人比较懒,就懒得跑程序再截效果图了,由于代码是拿工作中使用代码更改而成,比较粗糙,只此记录一个实现思路。