动态壁纸-蝴蝶

往背景图上贴小图

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

您好!关于 Java POI 对比图表-蝴蝶图的问题,我可以给您提供一些参考意见。 首先,需要明确的是,POI 是 Java 语言操作 Microsoft Office 文件的一种 API,可以用来创建、读取和修改 Excel 文件。而对比图表-蝴蝶图是 Excel 中的一种图表类型,用于比较两个相似数据系列之间的差异。 在 Java POI 中创建对比图表-蝴蝶图,可以参考以下步骤: 1. 创建一个工作簿对象,并在其中创建一个工作表对象。 2. 在工作表中创建两个数据系列,并设置其数据范围。 3. 创建一个蝴蝶图对象,并将其插入到工作表中。 4. 将两个数据系列添加到蝴蝶图中,并设置其名称和颜色等属性。 这里给出一个简单的示例代码,供您参考: ``` // 创建一个工作簿对象 Workbook wb = new XSSFWorkbook(); // 在工作簿中创建一个工作表对象 Sheet sheet = wb.createSheet("蝴蝶图"); // 在工作表中创建两个数据系列 Row row1 = sheet.createRow(0); row1.createCell(0).setCellValue("产品A"); row1.createCell(1).setCellValue(100); row1.createCell(2).setCellValue(200); row1.createCell(3).setCellValue(300); Row row2 = sheet.createRow(1); row2.createCell(0).setCellValue("产品B"); row2.createCell(1).setCellValue(150); row2.createCell(2).setCellValue(250); row2.createCell(3).setCellValue(350); // 创建一个蝴蝶图对象,并将其插入到工作表中 Drawing<?> drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 20); Chart chart = drawing.createChart(anchor); ChartLegend legend = chart.getOrCreateLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); // 将两个数据系列添加到蝴蝶图中,并设置其名称和颜色等属性 ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 1, 3)); ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 1, 3)); ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 1, 3)); LineChartData data1 = chart.getChartDataFactory().createLineChartData(); LineChartSeries series1 = data1.addSeries(xs, ys1); series1.setTitle("产品A"); series1.setSmooth(false); series1.setMarkerSize((short) 6); series1.setMarkerStyle(MarkerStyle.CIRCLE); series1.setLineColor(IndexedColors.BLACK.index); LineChartData data2 = chart.getChartDataFactory().createLineChartData(); LineChartSeries series2 = data2.addSeries(xs, ys2); series2.setTitle("产品B"); series2.setSmooth(false); series2.setMarkerSize((short) 6); series2.setMarkerStyle(MarkerStyle.TRIANGLE); series2.setLineColor(IndexedColors.RED.index); chart.plot(data1, new ChartAxis[]{}, new ChartAxis[]{}, data2); ``` 以上是一个简单的示例代码,用于演示如何使用 Java POI 创建对比图表-蝴蝶图。实际应用中,还需要根据具体需求进行适当调整和优化。希望这些信息能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值