动态壁纸-蝴蝶

往背景图上贴小图

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()方法传到蝴蝶对象中,并且在设置随机停留点时也要将停留点乘以相应的比例。

你可能感兴趣的:(c,null,360,float,Matrix)