天天看點

android處理圖檔

/* 定義displaymetrics對象 */

  displaymetrics dm = new displaymetrics();

  /* 取得視窗屬性 */

  getwindowmanager().getdefaultdisplay().getmetrics(dm);

1.基本圖像繪制

 /* 建立兩個圖檔對象 */

 bitmap   mbitqq  = null;

 bitmap   mbitdesttop = null;

 int    midtx  = 0;

 public gameview(context context)

 {

  super(context);

  mpaint = new paint();

  midtx  = 0;

  /* 從資源檔案中裝載圖檔 */

  //getresources()->得到resources

  //getdrawable()->得到資源中的drawable對象,參數為資源索引id

  //getbitmap()->得到bitmap

  mbitqq = ((bitmapdrawable) getresources().getdrawable(r.drawable.qq)).getbitmap();

  mbitdesttop = ((bitmapdrawable) getresources().getdrawable(r.drawable.desktop)).getbitmap();

  new thread(this).start();

 }

 public void ondraw(canvas canvas)

  super.ondraw(canvas);

  /* 清屏效果 */

  canvas.drawcolor(color.gray);

  /* 在螢幕(0,0)處繪制圖檔mbitqq */

  gameview.drawimage(canvas, mbitqq, 0, 0);

  /* 在制定位置按指定裁剪的漁區進行繪制 */

  //getwidth()->得到圖檔的寬度

  //getheight()->得到圖檔的高度

  gameview.drawimage(canvas, mbitdesttop, midtx, mbitqq.getheight(), mbitdesttop.getwidth(), mbitdesttop.getheight()/2, 0, 0);

2。旋轉圖檔

public void ondraw(canvas canvas)

  /* 重置mmatrix */

  mmatrix.reset();

  /* 設定旋轉 */

  mmatrix.setrotate(angle);

  /* 按mmatrix得旋轉建構新的bitmap */

  bitmap mbitqq2 = bitmap.createbitmap(mbitqq, 0, 0, bitqqwidth,bitqqheight, mmatrix, true);

  /* 繪制旋轉之後的圖檔 */

  gameview.drawimage(canvas, mbitqq2, (320-bitqqwidth)/2, 10);

  mbitqq2 = null;

3。縮放圖檔

  /* 設定縮放 */

  mmatrix.postscale(scale,scale);

4。混合渲染

/* 得到圖檔的寬度和高度 */

  bitqqwidth = mbitqq.getwidth();

  bitqqheight = mbitqq.getheight();

  /* 建立bitmapshader對象 */

  mbitmapshader = new bitmapshader(mbitqq,shader.tilemode.repeat,shader.tilemode.mirror);

  /* 建立lineargradient并設定漸變的顔色數組 */

  mlineargradient = new lineargradient(0,0,100,100,

            new int[]{color.red,color.green,color.blue,color.white},

            null,shader.tilemode.repeat);

  /* 這裡筆者了解為“混合渲染”--大家可以有自己的了解,能明白這個意思就好*/

  mcomposeshader = new composeshader(mbitmapshader,mlineargradient,porterduff.mode.darken);

  /* 建構radialgradient對象,設定半徑的屬性 */

  //這裡使用了bitmapshader和lineargradient進行混合

  //當然也可以使用其他的組合

  //混合渲染的模式很多,可以根據自己需要來選擇

  mradialgradient = new radialgradient(50,200,50,

            new int[]{color.green,color.red,color.blue,color.white},

  /* 建構sweepgradient對象 */

  msweepgradient = new sweepgradient(30,30,new int[]{color.green,color.red,color.blue,color.white},null);

  /* 開啟線程 */

  //将圖檔裁剪為橢圓形

  /* 建構shapedrawable對象并定義形狀為橢圓 */

  mshapedrawableqq = new shapedrawable(new ovalshape());

  /* 設定要繪制的橢圓形的東西為shapedrawable圖檔 */

  mshapedrawableqq.getpaint().setshader(mbitmapshader);

  /* 設定顯示區域 */

  mshapedrawableqq.setbounds(0,0, bitqqwidth, bitqqheight);

  /* 繪制shapedrawableqq */

  mshapedrawableqq.draw(canvas);  

  //繪制漸變的矩形

  mpaint.setshader(mlineargradient);

  canvas.drawrect(bitqqwidth, 0, 320, 156, mpaint);

  //顯示混合渲染效果

  mpaint.setshader(mcomposeshader);

  canvas.drawrect(0, 300, bitqqwidth, 300+bitqqheight, mpaint);

  //繪制環形漸變

  mpaint.setshader(mradialgradient);

  canvas.drawcircle(50, 200, 50, mpaint);

  //繪制梯度漸變

  mpaint.setshader(msweepgradient);

  canvas.drawrect(150, 160, 300, 300, mpaint);

5。圖檔水紋處理

public class gameview extends view implements runnable

{

    int backwidth;

    int backheight;

    short[] buf2;

    short[] buf1;

    int[] bitmap2;

    int[] bitmap1;

  /* 裝載圖檔 */

     bitmap   image = bitmapfactory.decoderesource(this.getresources(),r.drawable.qq);

     backwidth = image.getwidth();

     backheight = image.getheight();

        buf2 = new short[backwidth * backheight];

        buf1 = new short[backwidth * backheight];

        bitmap2 = new int[backwidth * backheight];

        bitmap1 = new int[backwidth * backheight];

        /* 加載圖檔的像素到數組中 */

        image.getpixels(bitmap1, 0, backwidth, 0, 0, backwidth, backheight);

    void dropstone(int x,// x坐标

       int y,// y坐标

       int stonesize,// 波源半徑

       int stoneweight)// 波源能量

  for (int posx = x - stonesize; posx < x + stonesize; posx++)

   for (int posy = y - stonesize; posy < y + stonesize; posy++)

    if ((posx - x) * (posx - x) + (posy - y) * (posy - y) < stonesize * stonesize)

     buf1[backwidth * posy + posx] = (short) -stoneweight;

    void ripplespread()

  for (int i = backwidth; i < backwidth * backheight - backwidth; i++)

  {

   // 波能擴散

   buf2[i] = (short) (((buf1[i - 1] + buf1[i + 1] + buf1[i - backwidth] + buf1[i + backwidth]) >> 1) - buf2[i]);

   // 波能衰減

   buf2[i] -= buf2[i] >> 5;

  }

  // 交換波能資料緩沖區

  short[] ptmp = buf1;

  buf1 = buf2;

  buf2 = ptmp;

    /* 渲染你水紋效果 */

 void render()

  int xoff, yoff;

  int k = backwidth;

  for (int i = 1; i < backheight - 1; i++)

   for (int j = 0; j < backwidth; j++)

   {

    // 計算偏移量

    xoff = buf1[k - 1] - buf1[k + 1];

    yoff = buf1[k - backwidth] - buf1[k + backwidth];

    // 判斷坐标是否在視窗範圍内

    if ((i + yoff) < 0)

    {

     k++;

     continue;

    }

    if ((i + yoff) > backheight)

    if ((j + xoff) < 0)

    if ((j + xoff) > backwidth)

    // 計算出偏移象素和原始象素的記憶體位址偏移量

    int pos1, pos2;

    pos1 = backwidth * (i + yoff) + (j + xoff);

    pos2 = backwidth * i + j;

    bitmap2[pos2++] = bitmap1[pos1++];

    k++;

   }

  /* 繪制經過處理的圖檔效果 */

  canvas.drawbitmap(bitmap2, 0, backwidth, 0, 0, backwidth, backheight, false, null);

 // 觸筆事件

 public boolean ontouchevent(motionevent event)

  return true;

 // 按鍵按下事件

 public boolean onkeydown(int keycode, keyevent event)

 // 按鍵彈起事件

 public boolean onkeyup(int keycode, keyevent event)

  dropstone(backwidth/2, backheight/2, 10, 30);

  return false;

 public boolean onkeymultiple(int keycode, int repeatcount, keyevent event)

 /**

  * 線程處理

  */

 public void run()

  while (!thread.currentthread().isinterrupted())

   try

    thread.sleep(50);

   catch (interruptedexception e)

    thread.currentthread().interrupt();

         ripplespread();

         render();

   //使用postinvalidate可以直接線上程中更新界面

   postinvalidate();

}

繼續閱讀