且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)

更新时间:2022-09-19 23:18:53

本文讲解主要涉及的知识点:

1.线程控制 
2.画图类 
3.心形函数

大家先看图片:

Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)

因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码:

里面设置两个类,一个是我们的activity类,这个类用来显示示图,然后建一个继承SurfaceView的类,我们在这里面画图。先贴两个累的代码:

主类名:GameMainActivity,画图类类名:Love.

1  package com.cz.game.demo; 
2  
3  import android.app.Activity; 
4  import android.os.Bundle; 
5  
6  public class GameMainActivity extends Activity { 
7      /** Called when the activity is first created. */ 
8  
9      private Love love; 
10     @Override 
11     public void onCreate(Bundle savedInstanceState) { 
12         super.onCreate(savedInstanceState); 
13         this.love = new Love(this); 
14         setContentView(love); 
15     } 
16 } 
 

画图类:

1   /** 
2    *  
3    */ 
4   package com.cz.game.demo; 
5   
6   import android.content.Context; 
7   import android.graphics.Canvas; 
8   import android.graphics.Color; 
9   import android.graphics.Paint; 
10  import android.graphics.RectF; 
11  import android.graphics.Typeface; 
12  import android.view.SurfaceHolder; 
13  import android.view.SurfaceView; 
14  
15  /** 
16   * @author CZ 
17   *  
18   */ 
19  public class Love extends SurfaceView implements SurfaceHolder.Callback, 
20          Runnable { 
21  
22      boolean mbloop = false; 
23      SurfaceHolder mSurfaceHolder = null; 
24      private Canvas canvas; 
25      int miCount = 0; 
26      int y = 50; 
27  
28      /** 
29       * @param context 
30       */ 
31      public Love(Context context) { 
32          super(context); 
33          mSurfaceHolder = this.getHolder(); 
34          mSurfaceHolder.addCallback(this); 
35          this.setFocusable(true); 
36          this.setKeepScreenOn(true); 
37          mbloop = true; 
38      } 
39  
40      /* 
41       * (non-Javadoc) 
42       *  
43       * @see 
44       * android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder 
45       * , int, int, int) 
46       */ 
47      @Override 
48      public void surfaceChanged(SurfaceHolder holder, int format, int width, 
49              int height) { 
50          // TODO Auto-generated method stub 
51  
52      } 
53  
54      /* 
55       * (non-Javadoc) 
56       *  
57       * @see 
58       * android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder 
59       * ) 
60       */ 
61      @Override 
62      public void surfaceCreated(SurfaceHolder holder) { 
63          // TODO Auto-generated method stub 
64          new Thread(this).start(); 
65      } 
66  
67      /* 
68       * (non-Javadoc) 
69       *  
70       * @seeandroid.view.SurfaceHolder.Callback#surfaceDestroyed(android.view. 
71       * SurfaceHolder) 
72       */ 
73      @Override 
74      public void surfaceDestroyed(SurfaceHolder holder) { 
75          // TODO Auto-generated method stub 
76          mbloop = false; 
77      } 
78  
79      /* 
80       * (non-Javadoc) 
81       *  
82       * @see java.lang.Runnable#run() 
83       */ 
84      @Override 
85      public void run() { 
86          // TODO Auto-generated method stub 
87          while (mbloop) { 
88              try { 
89                  Thread.sleep(200); 
90              } catch (Exception e) { 
91                  // TODO: handle exception 
92              } 
93              synchronized (mSurfaceHolder) { 
94                  Draw(); 
95              } 
96          } 
97      } 
98  
99      /** 
100      *  
101      * Year:2011 Date:2011-7-27 Time:下午06:52:04 Author:CZ TODO 
102      */ 
103     private void Draw() { 
104         // TODO Auto-generated method stub 
105         canvas = mSurfaceHolder.lockCanvas(); 
106         try { 
107             if (mSurfaceHolder == null || canvas == null) { 
108                 return; 
109             } 
110             if (miCount < 100) { 
111                 miCount++; 
112             } else { 
113                 miCount = 0; 
114             } 
115             Paint paint = new Paint(); 
116             paint.setAntiAlias(true); 
117             paint.setColor(Color.BLACK); 
118             canvas.drawRect(0, 0, 320, 480, paint); 
119             switch (miCount % 6) { 
120             case 0: 
121                 paint.setColor(Color.BLUE); 
122                 break; 
123             case 1: 
124                 paint.setColor(Color.GREEN); 
125                 break; 
126             case 2: 
127                 paint.setColor(Color.RED); 
128                 break; 
129             case 3: 
130                 paint.setColor(Color.YELLOW); 
131                 break; 
132             case 4: 
133                 paint.setColor(Color.argb(255, 255, 181, 216)); 
134                 break; 
135             case 5: 
136                 paint.setColor(Color.argb(255, 0, 255, 255)); 
137                 break; 
138             default: 
139                 paint.setColor(Color.WHITE); 
140                 break; 
141             } 
142             int i, j; 
143             double x, y, r; 
144 
145             for (i = 0; i <= 90; i++) { 
146                 for (j = 0; j <= 90; j++) { 
147                     r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j)) 
148                             * 20; 
149                     x = r * Math.cos(Math.PI / 45 * j) 
150                             * Math.sin(Math.PI / 45 * i) + 320 / 2; 
151                     y = -r * Math.sin(Math.PI / 45 * j) + 400 / 4; 
152                     canvas.drawPoint((float) x, (float) y, paint); 
153                 } 
154             } 
155 
156             paint.setTextSize(32); 
157             paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC)); 
158 
159             RectF rect = new RectF(60, 400, 260, 405); 
160             canvas.drawRoundRect(rect, (float) 1.0, (float) 1.0, paint); 
161             canvas.drawText("Loving You", 75, 400, paint); 
162             mSurfaceHolder.unlockCanvasAndPost(canvas); 
163         } catch (Exception e) { 
164         } 
165 
166     } 
167 
168 } 
169 
 

关于这个程序要讲解的几点:

1. 画图的时候你可以继承View,也可以继承SurfaceView,这两者的区别在于:surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,还有涉及的surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width, int height)方法,而在SurfaceHolder.Callback 接口回调中可以通过重写来改变这些方法

2.程序其实很简单, 既然生命了Runnable接口,就有相对应的Run方法,在surfaceCreate()的时候开启线程,线程每隔200ms就刷新一次,这样我们看到的效果就是闪烁的,每200毫秒 画一次图,根据经过的间隔时间来设置画笔的颜色,然后通过循环描点,画出心形,然后设置字体大小,画字和字下面的横线。

3.关于心形函数,是从一个例子中看来得,关于x和y的得到,

x = r * Math.cos(Math.PI / 45 * j)  * Math.sin(Math.PI / 45 * i) + 320 / 2;  y = -r * Math.sin(Math.PI / 45 * j) + 400 / 4;

320是屏幕的宽度,本来竖屏我设置的是480,可是下面得写字,就设置为400的了,关于画更好看的心形还有一个函数,大家可以看下:

Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)

有兴趣的童鞋可以设置再做一下.

关于这个代码就这么多,所以就不放附件代码了,把apk放上,之前就打算写这一篇博客,没想到在七夕这天写了。有兴趣的童鞋可以把apk下载下来给女友看哦…



本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/632632,如需转载请自行联系原作者