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