话里有话(趣味Android应用)

原文:http://www.adaiw.com/?p=147

看了阮一峰兄的 http://www.ruanyifeng.com/blog/2011/11/dice_portrait.html 骰子作画的算法, 觉得很有趣,就做了一个类似的应用,用自己的文字当做画笔来填充另外一段话, 效果如下:   算法非常简单:

1.从文字得到其图片,拿EidtText的CacheView。

? View Code JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  public static Bitmap CaptureView(View v) {
 
      Bitmap bitmap = null;
 
      Bitmap mBitmap2 = null;
 
      View view = (View) v;
      if (view != null) {
         if (!view.isDrawingCacheEnabled()) {
            view.setDrawingCacheEnabled(true);
         }
         if (!view.isDrawingCacheEnabled()) {
            Log.e("Capture", "drawing cache not enabled");
         }
         bitmap = view.getDrawingCache();
         if (bitmap == null) {
            Log.e("Capture", "bitmap is null");
            return null;
         }
         mBitmap2 = bitmap.copy(Bitmap.Config.RGB_565, true);
         view.setDrawingCacheEnabled(false);
         view.setDrawingCacheEnabled(true);
      }
      return mBitmap2;
   }

 

2.将图片分成若干个区域,每个区域经过计算以后,取每个点的灰度的平均值,用1-6之间的一个整数表示,代表一个画笔的编号。

3.把输入的内容文字逐个取出画到一个绑定了Bitmap的Canvas上。

? View Code JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      // Draw canvas with custom brushes.
      Canvas canvas = new Canvas();
      canvas.setBitmap(bitmap);
      if (meanArray != null) {
         for (int i = 0; i < outH; i++) {
            for (int j = 0; j < outW; j++) {
 
               int curBrush = meanArray[i][j];
               if (curBrush != MAX_BRUSH_INDEX) {
                  canvas.drawText(String.valueOf(mTextBrushes[getNextBrush()]),
                        BRUSH_W * j, BRUSH_H * i, paint);
               }
            }
         }
      }

 

4.将Bitmap保存为文件(/sdcard/adaiFill.png)。

? View Code JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 public static void saveBitmapToFile(Bitmap croppedImage, String outputPath) {
      if (croppedImage == null) {
         return;
      }
 
      Utils.log(LOG_TAG, "card w, h= " + croppedImage.getWidth() + ","
            + croppedImage.getHeight());
 
      if (outputPath == null || ("").equals(outputPath)) {
         Utils.log("saveBitmapToFile path = ", "null");
         return;
      }
 
      File file = new File(outputPath);
      if (file.exists()) {
         file.delete();
      }
      FileOutputStream fos;
 
      try {
         fos = new FileOutputStream(file);
         if (fos != null) {
            croppedImage.compress(Bitmap.CompressFormat.PNG, 99, fos);
         }
         fos.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

代码是开源的,见https://github.com/herbertdai/CanvasFill.git

APK 下载:http://code.google.com/p/canvas-fill/downloads/list

 

另外一个老兄用贝赛尔曲线也做出了类似的用文字填充的路径,不过他的工作看起来有点点复杂:http://planetclegg.com/projects/WarpingTextToSplines.html

你可能感兴趣的:(话里有话(趣味Android应用))