动态壁纸-蝴蝶

news/2025/2/12 20:52:26/

往背景图上贴小图

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


http://www.ppmy.cn/news/155527.html

相关文章

蝴蝶网络 Butterfly network

蝴蝶网络分支ntwk-butterfly git clone --branch ntwk-butterfly https://github.com/filecoin-project/lotus.git# cd lotus/ # git show commit 337c57093404431eb2d347f97f7d8f61993814cd (HEAD -> ntwk-butterfly, tag: ntwk-butterfly-7.10.0, origin/ntwk-butterfly)…

流星蝴蝶剑出招表

双刺&#xff1a; AAA&#xff08;或是AA&#xff09;左A&#xff08;或是右A&#xff09;下上A上上A(破防&#xff09; AAA&#xff08;或是AA&#xff09;左A&#xff08;或是右A&#xff09;上AA AAA下上A上上A&#xff08;破防&#xff09; AA下AA上上A&#xff08…

蝴蝶套胶Flextra-hard

前些天入手蝴蝶底版Taksim加大版21620&#xff0c;先上了红双喜普狂3&#xff0c;结果打了一段儿拉球总是下网&#xff0c;太硬了&#xff0c;今天没事儿就换了个蝴蝶的flextra&#xff0c;比狂飙软多了&#xff0c;下午打了一个多小时试着还行&#xff0c;就是稍微有点儿软&am…

Keychron K3 Pro键盘测评

目录 0.开箱 1.Keychron K3 Pro介绍 2.产品特点 2.1轻薄机身轴体解锁多场景办公 2.2 支持QMK/VIA开源改键蓝牙/有线双模客制化机械键盘 ​2.3支持MacOS/Windows系统秒切换不卡顿 2.4同时适配3台设备可快速切换 ​2.5支持QMK/VIA改键 2.6 超轻薄佳达隆矮轴,触感新体验 …

强推这款丝滑炫酷的keychron K8键盘

目录 前言1. keychron2. keychron K83. 个人体验 前言 键盘是码农爱惜之物&#xff0c;选择合适的键盘一直都是个难题&#xff0c;犹如女生挑选合适的口红色号。 笔记本内置键盘&#xff0c;好不好用一回事&#xff0c;哪天敲坏了得不偿失普通键盘&#xff0c;触摸感以及酷炫…

Shell脚本读文件和写文件

记录&#xff1a;439 场景&#xff1a;Shell脚本读文件和写文件。 版本&#xff1a;CentOS Linux release 7.9.2009。 1.Shell脚本使用cat读取文件内容 1.1脚本 脚本名称&#xff1a;b2023060121.sh 脚本内容&#xff1a; #!/bin/bashecho 1.使用cat读取文件内容,使用fo…

H2 DataBase入门

H2 DataBase入门整合hibernate整合mybatis整合springboot H2 是一个用 Java 编写的可嵌入的关系型数据库&#xff0c;H2的主要特点是&#xff1a; 非常快&#xff0c;开源&#xff0c;JDBC API 嵌入式和服务器模式&#xff1b;内存数据库 基于浏览器的控制台应用程序 占用空间…

java的h2是什么_什么是H2数据库

展开全部 H2是Thomas Mueller提供的一个开源的、纯java实现的关系数据库。e68a84e8a2ad3231313335323631343130323136353331333366306436 H2是一个开源的嵌入式数据库引擎&#xff0c;采用java语言编写&#xff0c;不受平台的限制&#xff0c;同时H2提供了一个十分方便的web控制…