本文讲解主要涉及的知识点:
1.线程控制
2.画图类
3.心形函数
大家先看图片:
蓝色粉绿色
红清黄色
因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码:
里面设置两个类,一个是我们的活动类,这个类用来显示示图,然后建一个继承SurfaceView的类,我们在这里面画图先贴两个累的代码:
主类名:GameMainActivity,画图类类名:爱。
1包com.cz.game.demo;
2
3导入android.app.Activity;
4导入android.os.Bundle;
五
6公共类GameMainActivity扩展Activity {
7 / *首次创建活动时调用。 /
8
9私密爱情;
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包com.cz.game.demo;
五
6导入android.content.Context;
7导入android.graphics.Canvas;
8导入android.graphics.Color;
9导入android.graphics.Paint;
10导入android.graphics.RectF;
11导入android.graphics.Typeface;
12导入android.view.SurfaceHolder;
13 import android.view.SurfaceView;
14
15 / **
16 * @author CZ
17 *
18 * /
19公共类Love扩展SurfaceView实现SurfaceHolder.Callback,
20 Runnable {
21
22 boolean mbloop = false;
23 SurfaceHolder mSurfaceHolder = null;
24私人帆布帆布;
25 int miCount = 0;
26 int y = 50;
27
28 / **
29 * @param上下文
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 *(非Java doc)
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自动生成的方法存根
51
52}
53
54 / *
55 *(非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自动生成的方法存根
64新线程(this).start();
65}
66
67 / *
68 *(非Javadoc)
69 *
70 * @ seeandroid.view.SurfaceHolder.Callback#surfaceDestroyed(android.view。
71 * SurfaceHolder)
72 * /
73 @Override
74 public void surfaceDestroyed(SurfaceHolder holder){
75 // TODO自动生成的方法存根
76 mbloop = false;
77}
78
79 / *
80 *(非Javadoc)
81 *
82 * @see java.lang.Runnable#run()
83 * /
84 @Override
85 public void run(){
86 // TODO自动生成的方法存根
87 while(mbloop){
88尝试{
89 Thread.sleep(200);
90} catch(例外e){
91 // TODO:处理异常
92}
93 synchronized(mSurfaceHolder){
94 Draw();
95}
96}
97}
98
99 / **
100 *
101 *年:2011日期:2011-7-27时间:下午06:52:04作者:CZ TODO
102 * /
103 private void Draw(){
104 // TODO自动生成的方法存根
105 canvas = mSurfaceHolder.lockCanvas();
106试试{
107 if(mSurfaceHolder == null || canvas == null){
108回归;
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开关(miCount%6){
120案例0:
121 paint.setColor(Color.BLUE);
122休息;
案例1:
124 paint.setColor(Color.GREEN);
125休息;
126案例2:
127 paint.setColor(Color.RED);
128休息;
129案例3:
130 paint.setColor(Color.YELLOW);
131休息;
案例4:
133 paint.setColor(Color.argb(255,255,181,216));
134休息;
案例5:
136 paint.setColor(Color.argb(255,0,255,255));
137休息;
138默认值:
139 paint.setColor(Color.WHITE);
140休息;
141}
142 int i,j;
143双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(“爱你”,75,400,画);
162 mSurfaceHolder.unlockCanvasAndPost(canvas);
163} catch(例外e){
164}
165
166}
167
168}
169
关于这个程序要讲解的几点:
1.画图的时候你可以继承View,也可以继承SurfaceView,这两者的区别在于:surfaceView是在一个新起的单独线程中可以重新绘制画面而。查看必须在UI的主线程中更新画面.SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,还有及其surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format,int width,int height)方法,而在SurfaceHolder.Callback接口回调中可以通过重写来改变这些方法
2.程序其实很简单,既然生命了Runnable接口,就有相对应的运行方法,在surfaceCreate()的时候开启线程,线程每隔200ms就刷新一次,这样我们看到的效果就是闪烁的,每200毫秒画一次图,根据经过的间隔时间来设置画笔的颜色,然后通过循环描点,画出心形,然后设置字体大小,画字和字下面的横线。
3.关于心形函数,是从一个例子中看来得,关于X和ÿ的得到,
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的了,关于画更好看的心形还有一个函数,大家可以看下:
5801107438_52486a79a2
有兴趣的童鞋可以设置再做一下。
关于这个代码就这么多,所以就不放附件代码了,把APK放上,之前就打算写这一篇博客,没想到在七夕这天写了。有兴趣的童鞋可以把APK下载下来给女友看哦…
本文出自“HDDevTeam”博客