本文讲解主要涉及的知识点:
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 &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 &lt;= <b>90</b>; i++) {
146 <b>for</b> (j = <b>0</b>; j &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,如需转载请自行联系原作者