天天看點

Android NinePatch

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

    }

}

繼續閱讀