Android中可以使用一种9-patch格式的图片,实现可拉伸效果。
9-Patch图片是指图片被标记的部分能够被拉伸的PNG文件,定义的时候需要以“.9.png”结尾。但其标识是文件名而不需要尾部的“.9.png”。
9-Patch是PNG图片的变种,它使用1个像素的边界来定义图片拉伸的区域。 创建9-Patch,先沿着图片的左上边界画1个像素的黑线来表示拉伸区域。其他未标记部分不会被拉伸,标记部分的相对大小会和图片大小变换一致。
9-Patch是为Views和Activities创建背景的一种最强大的工具,因为这些Views和Activities具有变化的大小。例如,Android使用9-patch为button创建背景。
但在使用过程中,由于Android的API doc很矬,简直不知道如何下手,网上去查,全都是说在xml文件中用android:background来指定,根本找不到直接在代码中使用的相关介绍。于是只好自己去看sdk源文件了,才终于把它搞定了。
下面说一下具体做法:
1. 首先制作一张9-patch图片,假设文件名是 image.9.png,将其放入res/drawable文件夹中;
2. 写如下代码:
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.image);
// res 为取得的Resources对象
NinePatch npImage = new NinePatch(bmp, bmp.getNinePatchChunk(), null);
然后在需要绘制的地方使用下面语句:
npImage.draw(canvas, rect);
3. Android中的Rect对象是(left, top, right, buttom)格式的,我一开始以为和Ruby 一样是(left, top, width, height)格式,结果老是画不出来,汗!
class MyView extends View{
Bitmap bm1,bm2;
Paint paint=new Paint();
public MyView(Context context) {
super(context);
bm1 = BitmapFactory.decodeResource(getResources(), R.drawable.t1);
bm2 = BitmapFactory.decodeResource(getResources(), R.drawable.t2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
RectF rectf = new RectF(0, 0, 240, 280);
//普通png放大
canvas.drawBitmap(bm1, null, rectf, paint);
//创建一个ninePatch的对象实例,
//第一个参数是bitmap
//第二个参数为如何处理拉伸方式, .9.png中自身有这些信息,只需要调用getNinePatchChunk()即可
//第三个参数是图片名,可为空
NinePatch np = new NinePatch(bm2, bm2.getNinePatchChunk(), null);
//9妹png放大
np.draw(canvas, rectf);
}
}