天天看点

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

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

1.线程控制 

2.画图类 

3.心形函数

大家先看图片:

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

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

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

1  <b>package</b> com.cz.game.demo; 

2  

3  <b>import</b> android.app.Activity; 

4  <b>import</b> android.os.Bundle; 

5  

6  <b>public</b> <b>class</b> GameMainActivity <b>extends</b> Activity { 

7      /** Called when the activity is first created. */ 

8  

9      <b>private</b> Love love; 

10     @Override 

11     <b>public</b> <b>void</b> onCreate(Bundle savedInstanceState) { 

12         <b>super</b>.onCreate(savedInstanceState); 

13         <b>this</b>.love = <b>new</b> Love(<b>this</b>); 

14         setContentView(love); 

15     } 

16 } 

画图类:

1   /** 

2    *  

3    */ 

4   <b>package</b> com.cz.game.demo; 

5   

6   <b>import</b> android.content.Context; 

7   <b>import</b> android.graphics.Canvas; 

8   <b>import</b> android.graphics.Color; 

9   <b>import</b> android.graphics.Paint; 

10  <b>import</b> android.graphics.RectF; 

11  <b>import</b> android.graphics.Typeface; 

12  <b>import</b> android.view.SurfaceHolder; 

13  <b>import</b> android.view.SurfaceView; 

14  

15  /** 

16   * @author CZ 

17   *  

18   */ 

19  <b>public</b> <b>class</b> Love <b>extends</b> SurfaceView <b>implements</b> SurfaceHolder.Callback, 

20          Runnable { 

21  

22      <b>boolean</b> mbloop = <b>false</b>; 

23      SurfaceHolder mSurfaceHolder = <b>null</b>; 

24      <b>private</b> Canvas canvas; 

25      <b>int</b> miCount = <b>0</b>; 

26      <b>int</b> y = <b>50</b>; 

27  

28      /** 

29       * @param context 

30       */ 

31      <b>public</b> Love(Context context) { 

32          <b>super</b>(context); 

33          mSurfaceHolder = <b>this</b>.getHolder(); 

34          mSurfaceHolder.addCallback(<b>this</b>); 

35          <b>this</b>.setFocusable(<b>true</b>); 

36          <b>this</b>.setKeepScreenOn(<b>true</b>); 

37          mbloop = <b>true</b>; 

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      <b>public</b> <b>void</b> surfaceChanged(SurfaceHolder holder, <b>int</b> format, <b>int</b> width, 

49              <b>int</b> 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      <b>public</b> <b>void</b> surfaceCreated(SurfaceHolder holder) { 

63          // TODO Auto-generated method stub 

64          <b>new</b> Thread(<b>this</b>).start(); 

65      } 

66  

67      /* 

68       * (non-Javadoc) 

69       *  

70       * @seeandroid.view.SurfaceHolder.Callback#surfaceDestroyed(android.view. 

71       * SurfaceHolder) 

72       */ 

73      @Override 

74      <b>public</b> <b>void</b> surfaceDestroyed(SurfaceHolder holder) { 

75          // TODO Auto-generated method stub 

76          mbloop = <b>false</b>; 

77      } 

78  

79      /* 

80       * (non-Javadoc) 

81       *  

82       * @see java.lang.Runnable#run() 

83       */ 

84      @Override 

85      <b>public</b> <b>void</b> run() { 

86          // TODO Auto-generated method stub 

87          <b>while</b> (mbloop) { 

88              <b>try</b> { 

89                  Thread.sleep(<b>200</b>); 

90              } <b>catch</b> (Exception e) { 

91                  // TODO: handle exception 

92              } 

93              <b>synchronized</b> (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     <b>private</b> <b>void</b> Draw() { 

104         // TODO Auto-generated method stub 

105         canvas = mSurfaceHolder.lockCanvas(); 

106         <b>try</b> { 

107             <b>if</b> (mSurfaceHolder == <b>null</b> || canvas == <b>null</b>) { 

108                 <b>return</b>; 

109             } 

110             <b>if</b> (miCount &amp;lt; <b>100</b>) { 

111                 miCount++; 

112             } <b>else</b> { 

113                 miCount = <b>0</b>; 

114             } 

115             Paint paint = <b>new</b> Paint(); 

116             paint.setAntiAlias(<b>true</b>); 

117             paint.setColor(Color.BLACK); 

118             canvas.drawRect(<b>0</b>, <b>0</b>, <b>320</b>, <b>480</b>, paint); 

119             <b>switch</b> (miCount % <b>6</b>) { 

120             <b>case</b> <b>0</b>: 

121                 paint.setColor(Color.BLUE); 

122                 <b>break</b>; 

123             <b>case</b> <b>1</b>: 

124                 paint.setColor(Color.GREEN); 

125                 <b>break</b>; 

126             <b>case</b> <b>2</b>: 

127                 paint.setColor(Color.RED); 

128                 <b>break</b>; 

129             <b>case</b> <b>3</b>: 

130                 paint.setColor(Color.YELLOW); 

131                 <b>break</b>; 

132             <b>case</b> <b>4</b>: 

133                 paint.setColor(Color.argb(<b>255</b>, <b>255</b>, <b>181</b>, <b>216</b>)); 

134                 <b>break</b>; 

135             <b>case</b> <b>5</b>: 

136                 paint.setColor(Color.argb(<b>255</b>, <b>0</b>, <b>255</b>, <b>255</b>)); 

137                 <b>break</b>; 

138             <b>default</b>: 

139                 paint.setColor(Color.WHITE); 

140                 <b>break</b>; 

141             } 

142             <b>int</b> i, j; 

143             <b>double</b> x, y, r; 

144 

145             <b>for</b> (i = <b>0</b>; i &amp;lt;= <b>90</b>; i++) { 

146                 <b>for</b> (j = <b>0</b>; j &amp;lt;= <b>90</b>; j++) { 

147                     r = Math.PI / <b>45</b> * i * (<b>1</b> - Math.sin(Math.PI / <b>45</b> * j)) 

148                             * <b>20</b>; 

149                     x = r * Math.cos(Math.PI / <b>45</b> * j) 

150                             * Math.sin(Math.PI / <b>45</b> * i) + <b>320</b> / <b>2</b>; 

151                     y = -r * Math.sin(Math.PI / <b>45</b> * j) + <b>400</b> / <b>4</b>; 

152                     canvas.drawPoint((<b>float</b>) x, (<b>float</b>) y, paint); 

153                 } 

154             } 

155 

156             paint.setTextSize(<b>32</b>); 

157             paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC)); 

158 

159             RectF rect = <b>new</b> RectF(<b>60</b>, <b>400</b>, <b>260</b>, <b>405</b>); 

160             canvas.drawRoundRect(rect, (<b>float</b>) <b>1</b>.<b>0</b>, (<b>float</b>) <b>1</b>.<b>0</b>, paint); 

161             canvas.drawText(<b>"</b><b>Loving</b><b> </b><b>You</b><b>"</b>, <b>75</b>, <b>400</b>, paint); 

162             mSurfaceHolder.unlockCanvasAndPost(canvas); 

163         } <b>catch</b> (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的了,关于画更好看的心形还有一个函数,大家可以看下:

<a href="http://hddev.blog.51cto.com/attachment/201108/6/3365350_1312622712s1uO.jpg"></a>

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

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

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

继续阅读