这是我为自己写的一款表白的程序,几经努力把它完成为一个完整的程序,这是我准备完成的程序之爱系列第一辑,希望能多做几辑吧。

源码地址:https://github.com/wuxia2001/mylove.git

地址:http://apk.hiapk.com/html/2014/01/2260344.html        

先上图吧


表白程序python 表白程序源码_i++

  

表白程序python 表白程序源码_表白程序python_02

  

表白程序python 表白程序源码_数组_03

  

表白程序python 表白程序源码_表白程序python_04

  

表白程序python 表白程序源码_System_05

  

表白程序python 表白程序源码_i++_06

  

表白程序python 表白程序源码_数组_07

  

表白程序python 表白程序源码_System_08

  

表白程序python 表白程序源码_数组_09

  

表白程序python 表白程序源码_表白程序python_10

  

表白程序python 表白程序源码_System_11

  

表白程序python 表白程序源码_数组_12

  

表白程序python 表白程序源码_表白程序python_13

  

表白程序python 表白程序源码_表白程序python_14

  

表白程序python 表白程序源码_数组_15




surfaceview画出来的。三个界面都是自己设计的,作为一个程序员,非美工,就不要对我的美术素养太苛刻了哈!

每个界面都有底层背景,加背景的方法:

    1.  //外面加背景   
    2. l1.setBackgroundResource(R.drawable.q2);  
    3.   
    4. //Surfaceview做设置  
    5. //透明  
    6. setZOrderOnTop(true);  
    7. holder.setFormat(PixelFormat.TRANSPARENT);


    awt得到的字的坐标,然后保存在文件里,再从文件里读出坐标,从而画出字。

    生成坐标的代码如下,这部分代码只能在电脑上运行,不能移植到手机端,所以这种方法只能用来显示事先设计好的字,但这种方法写出来的字效果去很好。代码如下

    1. /**
    2.      * 要写的字,我这里只试过单字,要保存的文件名,字体,调整X和Y位置,宽和高
    3.      * @param zi
    4.      * @param filename
    5.      * @param font
    6.      * @param outx
    7.      * @param outy
    8.      * @param w
    9.      * @param h
    10.      */  
    11. public static void zi(String zi, String filename, Font font,  
    12. int outx,int outy,int w,int h){  
    13. try  
    14.         {  
    15. //张 黑体,30号字。w40 h 29 array_zhang  
    16. //晚 黑体 30   
    17. //I 宋体 30号。 w12 h24 array_I  
    18. //U 宋体 30 号粗 w17 h24 array_U  
    19. //Font font = new Font("黑体", Font.PLAIN, 30);  
    20.               
    21. new AffineTransform();  
    22. new FontRenderContext(at, true, true);  
    23. // 要显示的文字  
    24.             Shape shape = gv.getOutline(outx,outy);  
    25. int weith = w;  
    26. int height = h;  
    27. boolean[][] view = new boolean[weith][height];  
    28. for (int i = 0; i < weith; i++)  
    29.             {  
    30. for (int j = 0; j < height; j++)  
    31.                 {  
    32. if (shape.contains(i, j))  
    33.                     {  
    34. true;  
    35. else  
    36.                     {  
    37. false;  
    38.                     }  
    39. //if(i == 7 && j>=3 && j<=6) view[i][j] = true;  
    40. //if(i == 6 && j == 8) view[i][j] = true;  
    41.                 }  
    42.             }  
    43. for (int j = 0; j < height; j++)  
    44.             {  
    45. for (int i = 0; i < weith; i++)  
    46.                 {  
    47. if (view[i][j])  
    48.                     {  
    49. "@");// 替换成你喜欢的图案  
    50. else  
    51.                     {  
    52. " ");  
    53.                     }  
    54.                 }  
    55.                 System.out.println();  
    56.             }  
    57.               
    58. new File(filename);  //存放数组数据的文件               
    59. new FileWriter(file);  //文件写入流              
    60. //将数组中的数据写入到文件中。每行各数据之间TAB间隔  
    61. for(int j=0;j<height;j++){  
    62. for(int i=0;i<weith;i++){  
    63. if(view[i][j])     
    64. 1+"b");  
    65. else out.write(0+"b");  
    66.                }  
    67. "n");  
    68.               }  
    69.               out.close();  
    70. catch (Exception e)  
    71.         {  
    72.             e.printStackTrace();  
    73.         }  
    74.     }



    就可以得坐标。

    在手机端读出来并写出来的代码如下:

    1. // 花 type 1为花,2为爱心  
    2. /**
    3.      * 开始x,开始Y坐标,字的宽,高,文件名字,放大倍数,type为图片种类
    4.      * @param stx
    5.      * @param sty
    6.      * @param w
    7.      * @param h
    8.      * @param filename
    9.      * @param beishu
    10.      * @param type
    11.      */  
    12. public void show_I(int stx, int sty, int w, int h, String filename,  
    13. int beishu, int type) {  
    14. int startx = stx, starty = sty;  
    15. try {  
    16. int weith = w;  
    17. int height = h;  
    18. boolean[][] arr = new boolean[weith][height]; // 插入的数组  
    19.             String file = filename;  
    20.             InputStream ins = Util.init().getAssetsInputStream(mContext, file);  
    21. new BufferedReader(new InputStreamReader(ins)); //  
    22. // 一行数据  
    23. int row = 0;  
    24. // 逐行读取,并将每个数组放入到数组中  
    25. new StringBuilder();  
    26. while ((line = in.readLine()) != null) {  
    27.                 sb.append(line);  
    28.             }  
    29.             System.out.println(sb.toString());  
    30.             in.close();  
    31.             String all = sb.toString();  
    32. "n");  
    33. //先得到坐标  
    34. for (int i = 0; i < all_a.length; i++) {  
    35. "b");  
    36.                 System.out.println();  
    37. for (int j = 0; j < all_b.length; j++) {  
    38. if (all_b[j].equals("0")) {  
    39. false;  
    40. else  
    41. true;  
    42.                 }  
    43.             }  
    44. int bei = beishu;  
    45. int dis = 25;  
    46. int old_num = -1;  
    47. for (int j = 0; j < height && !isallstop; j++) {  
    48. for (int i = 0; i <= weith && !isallstop; i++) {  
    49. //一定要sleep,要不然其他线程画不了东西  
    50. 25);  
    51. new Random();  
    52. null;  
    53. int num = 0;  
    54. if (type == 1) {  
    55. 1);  
    56.                         bitmap = bitmapcache  
    57.                                 .getBitmap(heart_all[num], mContext);  
    58. else if (type == 2) {  
    59.                         bitmap = bitmapcache.getBitmap(R.drawable.love,  
    60.                                 mContext);  
    61.                     }  
    62. int bw = bitmap.getWidth();  
    63. int bh = bitmap.getHeight();  
    64. if (i >= weith  && !isallstop) {  
    65.                       
    66.   
    67. synchronized (holder) {  
    68. null;  
    69. try {  
    70. float xx = (float) i;  
    71. float yy = (float) j;  
    72. //不要轻易去锁定整个屏幕  
    73. new Rect(startx + (int) xx  
    74. int) yy * bei,  
    75. int) xx * bei + dis, starty  
    76. int) yy * bei + dis));  
    77.   
    78. // c = holder.lockCanvas();  
    79. new Paint(); // 创建画笔  
    80.                             p.setColor(Color.RED);  
    81. //下面这段是保证双缓冲能都画上东西,从而不会闪烁  
    82. if (i > 0 && !isallstop) {  
    83. int xx_b = i - 1;  
    84. int yy_b = j;  
    85. if (arr[xx_b][yy_b]) {  
    86. if (old_num != -1) {  
    87. if (type == 1)  
    88.                                             c.drawBitmap(bitmapcache.getBitmap(  
    89.                                                     heart_all[old_num],  
    90.                                                     mContext), startx + xx_b  
    91.                                                     * bei, starty + yy_b * bei,  
    92.                                                     p);  
    93. else if (type == 2) {  
    94.                                             c.drawBitmap(bitmapcache.getBitmap(  
    95.                                                     R.drawable.love, mContext),  
    96.                                                     startx + xx_b * bei, starty  
    97.                                                             + yy_b * bei, p);  
    98.                                         }  
    99.                                     }  
    100.                                 }  
    101.                             }  
    102. if (arr[i][j] && !isallstop) {  
    103.                                 c.drawBitmap(bitmap, startx + xx * bei, starty  
    104.                                         + yy * bei, p);  
    105.                             }  
    106.                             old_num = num;  
    107. catch (Exception e) {  
    108.                             e.printStackTrace();  
    109. finally {  
    110. try{  
    111. if (c != null){  
    112. "white-space:pre">  </span>holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
    113.                                 }  
    114. catch(Exception e){  
    115.                                 e.printStackTrace();  
    116.                             }  
    117.                         }  
    118.                     }                     
    119.                 }  
    120.             }  
    121.   
    122. catch (Exception e) {  
    123.             e.printStackTrace();  
    124.         }  
    125.   
    126.     }


    16*16,24*24,32*32,48*48,我代码里有前三种,每种字体又分为黑体宋体楷体等几种,在经过每一种尝试后,我最终选择的24HZKS,代码里每一种都有代码,大家也可以对每种进行测试,如果只要适应一款分辨率的话,会有更好的适配字体,我这是为了适应大多数的分辨率选的这种。24*24的代码如下,

      1. public class Font24 {  
      2. private Context context;  
      3. public Font24(Context context){  
      4. this.context = context;  
      5.     }  
      6.       
      7. private final static int[] mask = {128, 64, 32, 16, 8, 4, 2, 1};  
      8. private final static String ENCODE = "GB2312";  
      9. private final static String ZK16 = "Hzk24s";  
      10.       
      11. private boolean[][] arr;  
      12. int all_16_32 = 24;  
      13. int all_2_4 = 3;  
      14. int all_32_128 = 72;  
      15. public boolean[][] drawString(String str){  
      16. byte[] data = null;  
      17. int[] code = null;  
      18. int byteCount;//到点阵数据的第几个字节了  
      19. int lCount;//控制列  
      20.             
      21. new boolean[all_16_32][all_16_32]; // 插入的数组  
      22. //g.setColor(color);  
      23. for(int i = 0;i < str.length();i ++){  
      24. if(str.charAt(i) < 0x80){//非中文  
      25. //g.drawString(str.substring(i,i+1),x+(i<<4),y,0);  
      26. continue;  
      27.               }  
      28. 1));  
      29. 0],code[1]);  
      30. 0;  
      31. for(int line = 0;line < all_16_32;line ++){  
      32. 0;  
      33. for(int k = 0;k < all_2_4;k ++){  
      34. for(int j = 0;j < 8;j ++){  
      35. // if((data[byteCount]&mask[j])==mask[j]){  
      36. if (((data[byteCount] >> (7 - j)) & 0x1) == 1) {  
      37. true;  
      38. "@");                            
      39. else{  
      40. " ");  
      41. false;  
      42.                           }  
      43.                           lCount++;  
      44.                       }  
      45.                       byteCount ++;  
      46.                   }  
      47.                   System.out.println();  
      48.               }  
      49.           }  
      50. return arr;  
      51.     }  
      52.            
      53. /**
      54.      *读取文字信息
      55.      *@param areaCode 区码
      56.      *@param posCode 位码
      57.      *@return 文字数据
      58.      */  
      59. protected byte[] read(int areaCode,int posCode){  
      60. byte[] data = null;  
      61. try{  
      62. int area = areaCode-0xa0;//获得真实区码  
      63. int pos  = posCode-0xa0;//获得真实位码  
      64.               
      65. //InputStream in = getClass().getResourceAsStream(ZK32);  
      66.             InputStream in = Util.init().getAssetsInputStream(context, ZK16);  
      67. long offset = all_32_128*((area-1)*94+pos-1);  
      68.             in.skip(offset);  
      69. new byte[all_32_128];  
      70. 0,all_32_128);  
      71.             in.close();  
      72. catch(Exception ex){  
      73.         }  
      74. return data;  
      75.     }  
      76.       
      77. /**
      78.      *获得文字的区位码
      79.      *@param str
      80.      *@return int[2]
      81.      */  
      82. protected int[] getByteCode(String str){  
      83. int[] byteCode = new int[2];  
      84. try{  
      85. byte[] data = str.getBytes(ENCODE);  
      86. 0] = data[0] < 0?256+data[0]:data[0];  
      87. 1] = data[1] < 0?256+data[1]:data[1];  
      88. catch(Exception ex){  
      89.             ex.printStackTrace();  
      90.         }  
      91. return byteCode;  
      92.     }  
      93.       
      94. }

      16和32的就是

        1. int all_16_32 = 24;  
        2. int all_2_4 = 3;  
        3. int all_32_128 = 72;


        三个参数不一样而己。

        用坐标系画字大体差不多,代码如下

        1. /**
        2.      * 16/24/32,要写的字符,开始的x,y,倍数,花或爱心
        3.      * @param font_kind
        4.      * @param s
        5.      * @param stx
        6.      * @param sty
        7.      * @param beishu
        8.      * @param type
        9.      */  
        10. public void show_font16_24_32(int font_kind,String s, int stx, int sty,   
        11. int beishu, int type) {  
        12. boolean[][] arr = null;  
        13. int weith = 16;  
        14. int height = 16;  
        15. if(font_kind == 16){  
        16. 16;  
        17. 16;  
        18. new boolean[weith][height];  
        19. new Font16(mContext);  
        20.             arr = font16.drawString(s);  
        21. else if(font_kind == 24){  
        22. 24;  
        23. 24;  
        24. new boolean[weith][height];  
        25. new Font24(mContext);  
        26.             arr = font24.drawString(s);  
        27. else {  
        28. 32;  
        29. 32;  
        30. new boolean[weith][height];  
        31. new Font32(mContext);  
        32.             arr = font32.drawString(s);  
        33.         }  
        34.                   
        35. int startx = stx, starty = sty;       
        36. int bei = beishu;  
        37. int old_num = -1;  
        38. int lCount;// 控制列  
        39. for (int i = 0; i < weith && !isallstop; i++) {  
        40. for (int j = 0; j < height && !isallstop; j++) {  
        41. try {  
        42. 25);  
        43. catch (InterruptedException e1) {  
        44. // TODO 自动生成的 catch 块  
        45.                     e1.printStackTrace();  
        46.                 }  
        47. float xx = (float) j;  
        48. float yy = (float) i;  
        49. if (arr[i][j] && !isallstop) {  
        50.   
        51. new Random();  
        52. null;  
        53. int num = 0;  
        54. if (type == 1) {  
        55. 1);  
        56.                         bitmap = bitmapcache  
        57.                                 .getBitmap(heart_all[num], mContext);  
        58. else if (type == 2) {  
        59.                         bitmap = bitmapcache.getBitmap(R.drawable.love,  
        60.                                 mContext);  
        61.                     }  
        62. int bw = bitmap.getWidth();  
        63. int bh = bitmap.getHeight();  
        64. synchronized (holder) {  
        65. null;  
        66. try {  
        67.   
        68. // 不要轻易去锁定整个屏幕  
        69. new Rect(startx + (int) xx  
        70. int) yy * bei, startx  
        71. int) xx * bei + bw, starty + (int) yy  
        72.                                     * bei + bh));  
        73.   
        74. // c = holder.lockCanvas();  
        75. new Paint(); // 创建画笔  
        76.                             p.setColor(Color.RED);  
        77. // 下面这段是保证双缓冲能都画上东西,从而不会闪烁  
        78.   
        79.                             c.drawBitmap(bitmap, startx + xx * bei, starty + yy  
        80.                                     * bei, p);  
        81.   
        82.                             old_num = num;  
        83. catch (Exception e) {  
        84.                             e.printStackTrace();  
        85. finally {  
        86. try{  
        87. if (c != null){  
        88. // 结束锁定画图,并提交改变。  
        89.                                 }  
        90. catch(Exception e){  
        91.                                 e.printStackTrace();  
        92.                             }  
        93.                         }  
        94.                     }  
        95.                 }



        画出爱心,最主要得到爱心的坐标就可以了,具体可参照:http://love.hackerzhou.me/ 

        1. private void run_hua_heart() {  
        2. // TODO 自动生成的方法存根  
        3. int startx = sw / 2 - 16, starty = sh / 2 - 68;  
        4. int maxh = 100;    
        5. int y_dao = starty;  
        6. double begin = 10; // 起始位置  
        7. new Random();  
        8. int old_num = -1;  
        9. float old_xx = 0, old_yy = 0;  
        10. for (int i = 0; i < maxh  && !isallstop; i++) {  
        11. try {  
        12. 80);  
        13. catch (InterruptedException e1) {  
        14. // TODO 自动生成的 catch 块  
        15.                     e1.printStackTrace();  
        16.                 }  
        17.   
        18. int hua_num = rm.nextInt(18);  
        19.                 Bitmap bit = bitmapcache  
        20.                         .getBitmap(heart_all[hua_num], mContext);  
        21. 0.2;  //密度  
        22. double b = begin / Math.PI;  
        23. double a = 13.5 * (16 * Math.pow(Math.sin(b), 3));  //这里的13.5可以控制大小  
        24. double d = -13.5  
        25. 13 * Math.cos(b) - 5 * Math.cos(2 * b) - 2  
        26. 3 * b) - Math.cos(4 * b));  
        27. synchronized (holder) {  
        28. null;  
        29. try {  
        30. float xx = (float) a;  
        31. float yy = (float) d;  
        32.   
        33. new Rect(  
        34. int) (startx + xx - 40),  
        35. int) (starty + yy - 40),  
        36. int) (startx + xx + 40),  
        37. int) (starty + yy + 40)));  
        38. new Paint(); // 创建画笔  
        39.                         p.setColor(Color.RED);  
        40. //画上一个,要不然会闪烁  
        41. if (old_num != -1) {  
        42.                             Bitmap bb = bitmapcache.getBitmap(  
        43.                                     heart_all[old_num], mContext);  
        44.                             c.drawBitmap(bb, startx + old_xx, starty + old_yy,  
        45.                                     p);  
        46.                         }  
        47.                         c.drawBitmap(bit, startx + xx, starty + yy, p);  
        48.                         old_num = hua_num;  
        49.                         old_xx = xx;  
        50.                         old_yy = yy;  
        51. // c.drawPoint(startx+xx,starty+yy, p);  
        52. catch (Exception e) {  
        53.                         e.printStackTrace();  
        54. finally {  
        55. try{  
        56. if (c != null){  
        57. // 结束锁定画图,并提交改变。  
        58.                             }  
        59. catch(Exception e){  
        60.                             e.printStackTrace();  
        61.                         }  
        62.                     }  
        63.                 }  
        64.


        第一界面就差不多了,一些花边就没必要说了。

        第二个界面,要说的也不多,那个一点点画出来的大的爱心是从PC端上移植过去的,但我感觉那个爱心不太圆满,也没时间去修正了,但要注意的是画这个爱心的时候容易发生闪烁,我还是把代码贴出来吧,

        1. public void run_heart() {  
        2. int i, j;  
        3. double x, y, r;  
        4. int max = 180;  
        5. //先计算出所有的位置,再去画图  
        6. float[][] x_ff = new float[max][max];  
        7. float[][] y_ff = new float[max][max];  
        8. for (i = 0; i < max; i++) {  
        9. for (j = 0; j < max; j++) {  
        10. double pi = Math.PI;  
        11. 45 * i * (1 - (Math.sin(pi / 45 * j))) * 18);  
        12. 45 * j)) * (Math.sin(pi / 45 * i)) + w / 2) * 1.01);  
        13. 45 * j)) + h / 4) * 1.01);  
        14. float) x;  
        15. float) y;  
        16.                 }  
        17.             }  
        18.   
        19. 0;  
        20. 0;  
        21. for (i = 0; i < max && !isallstop; i++) {  
        22.   
        23. //                  //sleep,屏幕  
        24. try {  
        25. 10);  
        26. //                      clearAll();  
        27. catch (InterruptedException e) {  
        28. //                      // TODO 自动生成的 catch 块  
        29.                         e.printStackTrace();  
        30.                     }  
        31. null;  
        32. int numm = 10;  
        33.                       
        34. for (j = 0; j < max && !isallstop; j=j+numm) {  
        35.                           
        36. synchronized (holder) {  
        37. try {  
        38. new Paint(); // 创建画笔  
        39.                             p.setColor(Color.RED);  
        40. //找出最大最小  
        41. float xx_min=x_ff[i][j],  
        42.                                     xx_max=x_ff[i][j],  
        43.                                     yy_min=y_ff[i][j],  
        44.                                     yy_max=y_ff[i][j];  
        45. for(int k =0;k<numm;k++){  
        46. float xx_n = x_ff[i][j+k];  
        47. float yy_n = y_ff[i][j+k];  
        48. if(xx_n >= xx_max) xx_max = xx_n;  
        49. if(xx_n <= xx_min) xx_min = xx_n;  
        50. if(yy_n >= yy_max) yy_max = yy_n;  
        51. if(yy_n <= yy_min) yy_min = yy_n;  
        52.                                           
        53.                             }  
        54. int xmin,xmax,ymin,ymax;  
        55. if(xx_min == 0) xmin = 0;  
        56. else xmin = (int) (xx_min-5>0?xx_min-5:0);  
        57. if(yy_min == 0) ymin = 0;  
        58. else ymin = (int) (yy_min-5>0?yy_min-5:0);  
        59. int) (xx_max+5);  
        60. int) (yy_max+5);  
        61.                               
        62.                           
        63. //c = holder.lockCanvas(new Rect(xi,yi,xa,ya));  
        64. new Rect(xmin,ymin,xmax,ymax));  
        65.                               
        66. if(j!=0){  
        67. int m = j-numm;  
        68. for(int k =0;k<numm;k++){  
        69. float xx_n = x_ff[i][m+k];  
        70. float yy_n = y_ff[i][m+k];  
        71.                                     c.drawPoint(xx_n, yy_n, p);  
        72.                                 }  
        73.                             }  
        74. for(int k =0;k<numm;k++){  
        75. float xx_n = x_ff[i][j+k];  
        76. float yy_n = y_ff[i][j+k];  
        77.                                 c.drawPoint(xx_n, yy_n, p);  
        78.                             }  
        79.   
        80. catch (Exception e) {  
        81.                             e.printStackTrace();  
        82. finally {  
        83. try{  
        84. if (c != null){  
        85. // 结束锁定画图,并提交改变。  
        86.                                 }  
        87. catch(Exception e){  
        88.                                 e.printStackTrace();  
        89.                             }  
        90.                         }  
        91.                         }  
        92.                 }  
        93.             }  
        94.         }

        第三个界面,如果有几张仙女连贯的动态图就好了,可惜我不是美工,尽管这整套都是我自己设计实现的,但不是美工无法设计出仙女散爱心的连续图,于是只能是晃啊晃啊然后爱心下落,下落后可以漂往左边或右边,并程抛物线飞行。

        爱心变大,星星闪烁,花朵移动都在一个线程里:

        1. public void show(){  
        2. ii = 30;  
        3. run = true;  
        4. p = new Paint();  
        5.               
        6.             //旋转的花  
        7. hua = bitmapcache.getBitmap(R.drawable.hua, mContext);  
        8. huax = dest_x-40+xadd/2;  
        9. huay = 30;  
        10. huaw = hua.getWidth();  
        11. huah = hua.getHeight();  
        12. huamax = 180;  
        13. huamin = 0;  
        14. hua_add_plus = 2;  
        15. huar=0;   
        16. re_num = 0;  
        17.               
        18.             //星  
        19. xin1 = bitmapcache.getBitmapByLM(R.drawable.xin1, mContext,2);  
        20. xin2 = bitmapcache.getBitmapByLM(R.drawable.xin2, mContext,2);  
        21. xin1w = xin1.getWidth();  
        22. xin1h = xin1.getHeight();  
        23. xin2w = xin2.getWidth();  
        24. xin2h = xin2.getHeight();  
        25.             //三个星1,三个星2  
        26. <LoveDot> xinall = new ArrayList<LoveDot>();  
        27.             xinall.add(new LoveDot(1+xadd,10,1));  
        28.             xinall.add(new LoveDot(48+xadd,18,1));  
        29.             xinall.add(new LoveDot(110+xadd,40,1));  
        30.             xinall.add(new LoveDot(20+xadd,150,2));  
        31.             xinall.add(new LoveDot(150+xadd,160,2));  
        32.             xinall.add(new LoveDot(130+xadd,190,2));  
        33.               
        34. xinboolean = true;  //为真的时候画星,为假的时候擦除  
        35. oldx = 0;  
        36.             while (true  && !isallstop) {  
        37.                 try {  
        38.                     Thread.sleep(150);  
        39.                 } catch (InterruptedException e2) {  
        40.                     // TODO 自动生成的 catch 块  
        41.                     e2.printStackTrace();  
        42.                 }  
        43.                   
        44.                 //旋转加透明  
        45.                 synchronized (holder) {  
        46. c = null;  
        47. b2 = null;     
        48.                     try {  
        49.                         //c.drawColor(co);                    
        50. m = new Matrix();  
        51.                         m.setRotate(huar);  
        52.                         p.setAlpha(255-Math.abs(huar));  
        53. b2 = Bitmap.createBitmap(  
        54.                                     hua, 0, 0, huaw,huah, m, true);   
        55. c = holder.lockCanvas(new Rect(huax,huay,huax+b2.getWidth(),  
        56.                                 huay+b2.getHeight()));  
        57.                         c.drawColor(Color.TRANSPARENT,Mode.CLEAR);  
        58.                         c.drawBitmap(b2, huax,huay, p);  
        59.                         //c.drawBitmap(big, dest_x, dest_y, p);  
        60.                           
        61. huar = huar+hua_add_plus;  
        62. huar==huamax) hua_add_plus = -2;  
        63. huar == huamin) hua_add_plus = 2;  
        64.                           
        65.                     } catch (Exception e) {  
        66.                         e.printStackTrace();  
        67.                     } finally {  
        68.                         try{  
        69.                             if (c != null){  
        70.                                 holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
        71.                             }  
        72.                         }catch(Exception e){  
        73.                             e.printStackTrace();  
        74.                         }  
        75.                         //if(b2 != null)  
        76.                         //  b2.recycle();  
        77.                     }  
        78.                 }  
        79.                   
        80.                   
        81.                 //星星闪烁  
        82.                 //为真的时候画星,为假的时候擦除  
        83.                 if(xinboolean){  
        84.                       
        85. d = xinall.get(oldx);  
        86. xinb = null;  
        87.                     int xw,xh;  
        88. xx = d.x;  
        89. yy = d.y;  
        90. d.num == 2){  
        91. xinb = xin2;  
        92. xw = xin2w;  
        93. xh = xin2h;  
        94.                     }  
        95.                     else {  
        96. xinb = xin1;  
        97. xw = xin1w;  
        98. xh = xin1h;  
        99.                     }  
        100.                       
        101.                     synchronized (holder) {  
        102. c = null;  
        103.                         try {  
        104. c = holder.lockCanvas(new Rect(xx,yy,xx+xw,yy+xh));                           
        105.                             p.setAlpha(255);  
        106.                             //c.drawColor(Color.TRANSPARENT,Mode.CLEAR);  
        107.                             c.drawBitmap(xinb, xx,yy, p);  
        108.                           
        109.                         } catch (Exception e) {  
        110.                             e.printStackTrace();  
        111.                         } finally {  
        112.                             try{  
        113.                                 if (c != null){  
        114.                                     holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
        115.                                 }  
        116.                             }catch(Exception e){  
        117.                                 e.printStackTrace();  
        118.                             }  
        119.                         }  
        120.   
        121.                     }  
        122. oldx = thisone;  
        123. xinboolean = !xinboolean;  
        124.                 }else{  
        125. thisone = getRandom(0, xinall.size()-1);  
        126. d = xinall.get(thisone);  
        127.                     int xw,xh;  
        128. xx = d.x;  
        129. yy = d.y;  
        130. d.num == 2){  
        131. xinb = xin2;  
        132. xw = xin2w;  
        133. xh = xin2h;  
        134.                     }  
        135.                     else {  
        136. xinb = xin1;  
        137. xw = xin1w;  
        138. xh = xin1h;  
        139.                     }  
        140.                     synchronized (holder) {  
        141. c = null;  
        142.                         try {  
        143. c = holder.lockCanvas(new Rect(xx,yy,xx+xw,yy+xh));                           
        144.                             p.setAlpha(255);  
        145.                             c.drawColor(Color.TRANSPARENT,Mode.CLEAR);                        
        146.                         } catch (Exception e) {  
        147.                             e.printStackTrace();  
        148.                         } finally {  
        149.                             try{  
        150.                                 if (c != null){  
        151.                                     holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
        152.                                 }  
        153.                             }catch(Exception e){  
        154.                                 e.printStackTrace();  
        155.                             }  
        156.                         }  
        157.   
        158.                     }  
        159. oldx = thisone;  
        160. xinboolean = !xinboolean;  
        161.                 }  
        162.                                                   
        163.                 re_num++;  
        164. >3){  
        165. re_num = 0;  
        166.                 }else continue;  
        167.                   
        168. big15 = bitmapcache.getBitmap(R.drawable.big99, mContext);  
        169.                 //Y为dest ,x 为dest - w/2  
        170. bw = big15.getWidth();  
        171. bh = big15.getHeight();  
        172. mBitmap = Bitmap.createScaledBitmap(big15, bw-ii, bh-ii, true);    
        173. bw = mBitmap.getWidth();  
        174. bh = mBitmap.getHeight();  
        175. x = dest_x-bw/2;  
        176. y = dest_y;  
        177.                 //  
        178. dropx = x;  
        179. dropy = y;  
        180. dropw = ,droph  
        181.                 synchronized (holder) {  
        182. c = null;  
        183.                     try {  
        184. c = holder.lockCanvas(new Rect(x-1,y-1,x+1+bw,y+1+bh));                   
        185.                         p.setAlpha(255);  
        186.                         c.drawColor(Color.TRANSPARENT,Mode.CLEAR);  
        187.                         c.drawBitmap(mBitmap, x,y, p);  
        188.                         //c.drawBitmap(big, dest_x, dest_y, p);  
        189.                     } catch (Exception e) {  
        190.                         e.printStackTrace();  
        191.                     } finally {  
        192.                         try{  
        193.                             if (c != null){  
        194.                                 holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
        195.                             }  
        196.                         }catch(Exception e){  
        197.                             e.printStackTrace();  
        198.                         }  
        199.                     }  
        200.   
        201.                 }  
        202.                 ii--;  
        203. <=0) {  
        204.                     try {  
        205.                         Thread.sleep(500);  
        206.                     } catch (InterruptedException e1) {  
        207.                         // TODO 自动生成的 catch 块  
        208.                         e1.printStackTrace();  
        209.                     }  
        210. ii = 30;  
        211.   
        212.                     synchronized (holder) {  
        213. c = null;  
        214.                         try {  
        215. c = holder.lockCanvas(new Rect(x-1,y-1,x+1+bw,y+1+bh));  
        216.                             //c.drawColor(co);  
        217.                             c.drawColor(Color.TRANSPARENT,Mode.CLEAR);  
        218.                             //c.drawBitmap(big15, x,y, p);  
        219.                             //c.drawBitmap(big, dest_x, dest_y, p);  
        220.                         } catch (Exception e) {  
        221.                             e.printStackTrace();  
        222.                         } finally {  
        223.                             try{  
        224.                                 if (c != null){  
        225.                                     holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
        226.                                 }  
        227.                             }catch(Exception e){  
        228.                                 e.printStackTrace();  
        229.                             }  
        230.                         }  
        231.   
        232.                     }  
        233.                     if(!isallstop){  
        234.                         dropnum++;  
        235. drop = new LoveDrop(dropnum,x,y);  
        236.                         drop.start();  
        237.                         dropthread_Add(dropnum, drop);  
        238.                         //new LoveDrop(x,y).start();  
        239.                     }  
        240.                               
        241.                     try {  
        242.                         Thread.sleep(1500);  
        243.                     } catch (InterruptedException e1) {  
        244.                         // TODO 自动生成的 catch 块  
        245.                         e1.printStackTrace();  
        246.                     }  
        247.                 }  
        248.             }  
        249.         }  
        250. <span style="font-size:14px;">下落的代码如下</span>  
        251. private void drop(){  
        252. startx = dest_x;  
        253. starty = dest_y+10;  
        254. endy = h-100;  //最多下落到这  
        255. endx = startx;  
        256. llove = bitmapcache.getBitmap(R.drawable.big_h, mContext);  
        257. bw = llove.getWidth();  
        258. bh = llove.getHeight();  
        259. p = new Paint();  
        260. isr = true;  
        261. de = 60;  
        262. dropw = bw+1;  
        263. droph = bh+1;  
        264.             while(isr && !isallstop){  
        265.                 synchronized (holder) {  
        266. c = null;  
        267.                     try {  
        268. xFermode = new PorterDuffXfermode(Mode.DST_ATOP);  
        269.                         //p.setXfermode(xFermode);  
        270. c = holder.lockCanvas(new Rect(startx,starty-2,startx+bw,starty+bh+1));                       
        271.                         c.drawColor(Color.TRANSPARENT,Mode.CLEAR);  
        272.                         c.drawBitmap(llove, startx,starty++, p);                          
        273.                     } catch (Exception e) {  
        274.                         e.printStackTrace();  
        275.                     } finally {  
        276.                         try{  
        277.                             if (c != null){  
        278.                                 holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
        279.                             }  
        280.                         }catch(Exception e){  
        281.                             e.printStackTrace();  
        282.                         }  
        283.                     }  
        284.   
        285.                 }  
        286.                 try {  
        287.                     Thread.sleep(de);  
        288.                 } catch (InterruptedException e) {  
        289.                     // TODO 自动生成的 catch 块  
        290.                     e.printStackTrace();  
        291.                 }  
        292. de=(long) (de-0.05);  
        293. <=40) de=(long) (de-0.01);  
        294. <=20) de = 20;  
        295. >= endy && !isallstop){//准备往左右  
        296. isr = false;  //结束线程  
        297.                      // 初始化y轴数据                   
        298. centerY = endy;  
        299. Y_axis = new int[w-startx];  
        300. left_right = getRandom(0, 10);  
        301. isright = true;  //为真为右,为假为左,为右的机会大些  
        302. <4){  //左  
        303. isright = false;  
        304.                     }  
        305.                     int le,top;  
        306.                       
        307. maxhh = endy - maxziy;  
        308. rmin = 80,rmax = 100;  
        309. lmin = 40,lmax = 50;  
        310. <100 && maxhh>50 ) {  
        311. rmin = 50;  
        312. rmax = 60;  
        313.                     }  
        314. < 50){  
        315. rmin = 30;  
        316. rmax = 40;  
        317. lmin = 20;  
        318. lmax = 30;  
        319.                     }  
        320.                       
        321.                     if(isright){  
        322. le = w-startx;  
        323. top = getRandom(rmin, rmax);  
        324.                     }  
        325.                     else {  
        326. le = startx+bw;  
        327. top = getRandom(lmin,lmax);  
        328.                     }  
        329. i = 1; i < le && !isallstop; i++) {// 计算正弦波  
        330.                         int x;  
        331.                         if(isright)  
        332. x = startx+i;  
        333. x = startx-i;  
        334. y=Asin(ωx+φ φ(初相位):决定波形与X轴位置关系或横向移动距离(左加右减)  
        335. T=2π/|ω|)  
        336.                         //      A:决定峰值(即纵向拉伸压缩的倍数)    
        337. y = centerY-Math.abs( (int) (top * Math.sin(i * 2 * Math.PI/ 180)));  
        338.                         synchronized (holder) {  
        339. c = null;  
        340.                             try {  
        341. c = holder.lockCanvas(new Rect(x-2,  
        342.                                         y-15, x + bw+1, y + bh  
        343.                                                 + 15));                               
        344.                                 c.drawColor(Color.TRANSPARENT, Mode.CLEAR);  
        345.                                 c.drawBitmap(llove, x, y, p);                                 
        346.                             } catch (Exception e) {  
        347.                                 e.printStackTrace();  
        348.                             } finally {  
        349.                                 try{  
        350.                                     if (c != null){  
        351.                                         holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。  
        352.                                     }  
        353.                                 }catch(Exception e){  
        354.                                     e.printStackTrace();  
        355.                                 }  
        356.                             }  
        357.   
        358.                         }// sy  
        359. delay = endy - y;  
        360.                         try {  
        361.                             //顶峰慢,delay 大,越慢,时间长  
        362.                             Thread.sleep(50+delay*2);  
        363.                             //System.out.println("y:"+y);  
        364.                         } catch (InterruptedException e) {  
        365.                             // TODO 自动生成的 catch 块  
        366.                             e.printStackTrace();  
        367.                         }  
        368.                     }     
        369.                 }  
        370.             }  
        371.         }



        至于字的显现,应该没什么好说,值得注意的是,还有一些闪烁的爱心和下缀的那一段,要注意这些坐标,不能覆盖字,要处理所有出现的心的坐标,和字的坐标。


        另外,还有播放声音的功能,可以自己设置合适的音乐或者自己录好自己想说的话然后播放出来。

        源码还在不断修改更新中,随意拿去自用。




        这里不能附件下载,于是源码上传到资源那里了。


        作者:wuxia2001