搭建公司网站多少钱,品牌网首页,北京建设工程信息网站,简单干净的网站1、引言 你是否还在因为不懂UI设计而不得不去借用别人的图片#xff0c;甚至使用各种网图作为界面布局的一部分#xff0c;那么今天就教你使用Bitmap对象去绘制自定义图形#xff0c;并保存为png格式的图片#xff0c;须知图片编辑软件本就是程序员开发出来的#xff0c;我…1、引言 你是否还在因为不懂UI设计而不得不去借用别人的图片甚至使用各种网图作为界面布局的一部分那么今天就教你使用Bitmap对象去绘制自定义图形并保存为png格式的图片须知图片编辑软件本就是程序员开发出来的我们又何必舍近求远呢用代码生成岂不是更爽
2、实现步骤
2.1、Bitmap对象创建 使用下面的方法创建Bitmp对象第一个参数代表创建的位图宽度第二个是位图高度宽度和高度的单位都是像素第三个是设置为支持透明背景这里要注意高度和宽度必须大于0后面索引也是从零开始。
Bitmap customBitmap Bitmap//通过控制每一个像素点生成bitmap对象可以用这种方式生成图片.createBitmap(501, 501, Bitmap.Config.ARGB_8888);//按像素设置
2.2、形状绘制 这里我以绘制透明背景圆形图片为例并提供两种方法第一种方法不适合绘制圆形但可以用来绘制多边形。由于是绘制圆形需要使用函数计算位置我这里提供了用于计算圆的坐标的函数。
2.1.1、圆的标准方程函数 这个函数借助圆的标准方程计算圆的坐标。 /*** 已知圆的半径圆心坐标x坐标求圆的y坐标* param r 圆的半径* param rx 圆心x坐标* param ry 圆心y坐标* param x 圆的某个位置的x坐标或y坐标默认是根据x坐标求y坐标如果需要根据y坐标求x坐标* 那么互换rx和ry位置传入y坐标返回的结果就是x坐标*/public static double[] circle(double r,double rx,double ry,double x){double[] result;//因为是标准方程且一定有解所以传入的第一个参数始终为1double b-2*ry;double cry*ryx*x-2*rx*xrx*rx-r*r;resultquadratic_equation_one(1,b,c);return result;}
2.1.2、一元二次方程函数 圆的计算过程中要用到一元二次方程所以这里提供计算一元二次方程的方法。 /*** 一元二次方程求解* param a 二次项系数* param b 一次项系数* param c 常数* return 计算结果返回数组*/public static double[] quadratic_equation_one(double a,double b,double c){double[] resultnull;//3、小于0有两个复根一般不考虑这种情况但为了完整都写好//三种情况double datab*b-4*a*c;if (data0){//1、大于0有两个实根resultnew double[2];result[0](-bMath.sqrt(data))/(2*a);result[1](-b-Math.sqrt(data))/(2*a);}else if (data0){//2、等于0有一个实根resultnew double[1];result[0](-b)/(2*a);}return result;}
3、绘制方法
3.1、方法一直接绘制 //方法一直接绘制圆部分区域会被错过int i,j;for (i 0; i 500; i) {//判断在圆的范围内才绘制for (j 0; j 250; j) {resultUiMath.circle(250-j,250,250,i-j);if (result!null){if (result.length1){//传入的x和y值必须大于0customBitmap.setPixel(i-j, (int) result[0],Color.parseColor(#ff0000));customBitmap.setPixel((int) result[0],i-j,Color.parseColor(#ff0000));}else if (result.length2){customBitmap.setPixel(i-j, (int) result[0],Color.parseColor(#ff0000));customBitmap.setPixel(i-j, (int) result[1],Color.parseColor(#ff0000));customBitmap.setPixel((int) result[0],i-j,Color.parseColor(#ff0000));customBitmap.setPixel((int) result[1],i-j,Color.parseColor(#ff0000));}}}}
3.2、方法二反向绘制 先把需要绘制的区域全部填充颜色然后的圆形以外的区域设置为透明色。
//方法二反向绘制
//1、先绘制背景色
for (i 0; i 500; i) {//判断在圆的范围内才绘制for (j 0; j 500; j) {customBitmap.setPixel(i,j,Color.parseColor(#ff0000));}
}
//2、去除多余区域
for (i 0; i 500; i) {resultUiMath.circle(250,250,250,i);if (result!null){if (result.length1){//传入的x和y值必须大于0for (j 0; j 500; j) {if (jresult[0] || jresult[0]){customBitmap.setPixel(i, j,Color.parseColor(#00000000));}}}else if (result.length2){for (j 0; j 500; j) {if (jresult[1] || jresult[0]){customBitmap.setPixel(i, j,Color.parseColor(#00000000));}}}}
}
4、保存图片 调用下面这个方法保存图片如果保存为jpg格式是没有透明效果的。 /*** 保存bitmap为图片*/private void saveBitmap(Bitmap bitmap) {new Thread(){Overridepublic void run() {File filenew File(getExternalFilesDir(null),now.png);try {FileOutputStream fosnew FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG,90,fos);fos.flush();fos.close();runOnUiThread(new Runnable() {Overridepublic void run() {Toast.makeText(CreateBitmapActivity.this,保存完成,Toast.LENGTH_SHORT).show();}});} catch (Exception e) {throw new RuntimeException(e);}}}.start();}
5、效果演示
5.1、方法一效果演示 5.2、方法二效果演示