天天看點

動态桌面-蝴蝶

往背景圖上貼小圖

1.建立一個空的标準大小的圖

bitmap = Bitmap.createBitmap(480, 800, Config.ARGB_8888);

2.建立畫布,将這個圖作為參數傳進來

Canvas c = new Canvas(bitmap);

3.将小圖畫到這個畫布上

c.drawBitmap(bm1, 97 , 0, null);

4.建立另一用于顯示的畫布

 Canvas c2 = holder.lockCanvas();

5.将标準大小的大圖縮放成小圖大小的圖

 Bitmap bit = Bitmap.createScaledBitmap(bitmap, x, y, true);

6.将縮小後大圖貼到用于顯示的畫布上顯示

c2.drawBitmap(bit, 0, 0, null);

注意:不能直接對背景圖進行縮放,要建立一張标準大小的圖

旋轉蝴蝶

1.儲存畫布

c.save();

2.繞蝴蝶中心轉,畫圖是從蝴蝶的上頂點畫開始的,取高寬的一半即為蝴蝶的中心點,二者相加

c.rotate(45, x+state[index%5].getHeight()/2, y+state[index%5].getWidth()/2);

3.開始畫圖

c.drawBitmap(state[index%5], x, y, null);

4.恢複畫布

c.restore();

與坐标軸成一定夾角的圖檔按指定路線運動

1.設一運動方向的速度,一旋轉夾角i,讓它在水準和豎直方向分解為水準變化量cx,豎直變化量cy,

2.cx =speed*Math.sin(Math.toRadians(i+30));cy = speed*Math.cos(Math.toRadians(i+30));

3.x+=cx;y+=cy;

4.當speed = 0時,蝴蝶停下來運動,另外再給一個計時器time,每重新整理一次,計時器加一,這樣就可以通過判斷計時器恢複蝴蝶的運動。

用camera縮放圖檔時,原來圖像是繞着中心旋轉的,縮小之後,小圖還是從原先的大圖的左上角畫開始,會産生跳躍。縮放過程:

1.Matrix m = new Matrix();

 Camera c1 = new Camera();

2.c1.save();

   c1.translate(0, 0, 300);

   c1.getMatrix(m);

   c1.restore();

為防止角度持續增大,在每次角度變化時進行判斷

if(i > 360)

     i-=360;

保證角度在0與360之間變化

用matrix對圖像進行縮放

1.int newWidth = 200;//設定新的圖檔大小

    int newHeight = 200;

2.int width = b1.getWidth();//擷取圖檔大小

   int height = b1.getHeight();

3.float scalWidth = (float)newWidth/width;//設定縮放比例

   float scalHeight = (float)newHeight/height;

4.Matrix m = new Matrix();

   m.postScale(scalWidth,scalHeight);

5.

   canvas.concat(m);

   Bitmap bit = Bitmap.createBitmap(b1,0,0,width,height,m,true);

   c.drawBitmap(bit,x+width/2-newWidth/2,y+height/2-newHeight/2);//縮放後畫圖還是從左上角畫開始

   m.reset();//一定要重置,不然圖像會一直縮放

處理蝴蝶在邊界傳回的問題:

設一随機數,讓蝴蝶在一随機處轉向

if(x > 480 || x < -width || y > 800 || y < -height ) { //超過邊界将轉向

   i+=(float)Math.random()+200;

   if(i > 360) {

    i = i -360;

   }

  }

if((x > stayX - 5) && (x < stayX + 5)) { //在一随機點停留

   speed = 0;

  }

 if(time == 35){

   time = 1;

   speed = 20;

   stayX = (float)Math.random()*200+200; //重新整理35次後重新擷取随機數

   if(i > 360) {

    i = i -360;

   }  

  }

記憶體溢出問題的處理

1.擷取圖檔資源

bm1 = BitmapFactory.decodeResource(getResources(), R.drawable.leaf01_1);

2.将擷取到的實際螢幕高度和寬度與480與800的比值自乘以圖像實際的高度與寬度進行壓縮

   bm1 = Bitmap.createScaledBitmap(bm1, (int)((x/480.0f*bm1.getWidth())), (int)((y/800.0f*bm1.getHeight())), true);

3.将壓縮後的圖像畫到畫布上

 Canvas c = holder.lockCanvas();//鎖定畫布

c.drawBitmap(bm1, 97 , 0, null);

holder.unlockCanvasAndPost(c);

   }

蝴蝶圖像出現在背景圖下面:這是畫圖順序的問題,先畫背景圖,再畫水滴跟動态葉子,最後畫蝴蝶,改變

 butterfly.draw(c,a,b);

 butterfly1.draw(c,a,b);

  butterfly2.draw(c,a,b);

的位置

蝴蝶按指定螢幕大小顯示,跟之前的縮放方法一樣,再将縮放後的圖像傳到蝴蝶對象中,使draw()方法隻執行畫圖操作,縮放操作都在外面做,可以省記憶體。

實作蝴蝶停留縮放,在初始化蝴蝶對象時調用的蝴蝶對象的方法中添加蝴蝶縮放方法scale(),因為一隻動态的蝴蝶是由五張不同形狀的圖像變換而成,是以要對五張圖都進行縮放,可以在調用縮放方法時執行一個循環,将縮放後的圖像放入一個對象數組中,然後在判斷蝴蝶停止的時候,将對象數組中的元素顯示出來。但要注意在每次縮放一張圖完後都要用m.reset()将矩陣重置。

關于将動态桌面設定為桌面一段時間後蝴蝶不會出現的問題:這是邊界處理的問題,

if(x > 480*a || x < -width || y > 800*b || y < -height ) {

   i+=(float)Math.random()+220;

   if(i > 360) {

    i = i -360;

   }

  }

因為我們在适應不同螢幕顯示的時候都有設定一個顯示比例,如果沒有将480跟800乘以對應的比例,就會出現蝴蝶越界的問題,這樣即使是随機取得的數值,蝴蝶也可能飛不回來。是以要将縮放比例通過蝴蝶對象的draw()方法傳到蝴蝶對象中,并且在設定随機停留點時也要将停留點乘以相應的比例。