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);
}
}