android SurfaceView绘制 重新学习--基础绘制

自从大二写了个android游戏去参加比赛,之后就一直写应用,一直没用过SurfaceView了,现在进入了游戏公司,准备从基础开始重新快速的学一下这个,然后再去研究openGL和游戏引擎。

直接上代码吧:

 1 import android.content.Context;
 2 import android.util.AttributeSet;
 3 import android.util.Log;
 4 import android.view.SurfaceHolder.Callback;
 5 import android.view.SurfaceView;
 6 import android.graphics.Canvas;
 7 import android.graphics.Color;
 8 import android.graphics.Paint;
 9 import android.graphics.Typeface;
10 import android.view.SurfaceHolder;
11 import android.view.animation.Animation;
12 
13 public class MySurfaceView extends SurfaceView implements Callback, Runnable {
14 
15     private SurfaceHolder sfh;
16     private Thread th;
17     private Canvas canvas;
18     private Paint paint;
19     private boolean threadFlag;
20 
21     public MySurfaceView(Context context) {
22         // this(context, null);
23 
24         super(context);
25         sfh = this.getHolder();
26         sfh.addCallback(this);
27         paint = new Paint();
28         paint.setAntiAlias(true);
29         paint.setColor(Color.RED);
30         paint.setTextSize(20);
31         Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
32         paint.setTypeface(font);
33         this.setKeepScreenOn(true);
34     }
35 
36     public MySurfaceView(Context context, AttributeSet attrs) {
37         super(context, attrs);
38         // th = new Thread(this);
39         // sfh = this.getHolder();
40         // sfh.addCallback(this);
41         // paint = new Paint();
42         // paint.setAntiAlias(true);
43         // paint.setColor(Color.RED);
44         // this.setKeepScreenOn(true);
45     }
46 
47     public void startAnimation(Animation animation) {
48         super.startAnimation(animation);
49     }
50 
51     public void surfaceCreated(SurfaceHolder holder) {
52         threadFlag = true;
53         th = new Thread(this);
54         th.start();
55     }
56 
57     private void draw() {
58         try {
59             canvas = sfh.lockCanvas(); // 获取画布
60             if (canvas != null) {
61                 canvas.drawColor(Color.WHITE);// 画布颜色
62                 canvas.drawText("奋斗的小猿", 100, 100, paint);
63                 canvas.drawText("加班,还是不加班,it's a question!", 100, 130, paint);
64             }
65         } catch (Exception ex) {
66         } finally {
67             if (canvas != null)
68                 sfh.unlockCanvasAndPost(canvas);
69         }
70     }
71 
72     public void run() {
73         while (threadFlag) {
74             Log.i("ceshi", "threadFlag=true");
75             draw();
76             try {
77                 Thread.sleep(100);
78             } catch (InterruptedException e) {
79                 e.printStackTrace();
80             }
81         }
82     }
83 
84     public void surfaceChanged(SurfaceHolder holder, int format, int width,
85             int height) {
86     }
87 
88     public void surfaceDestroyed(SurfaceHolder holder) {
89         threadFlag = false;
90     }
91 
92 }

android SurfaceView绘制 重新学习--基础绘制

这里Activity用的是

setContentView(new MySurfaceView(getApplicationContext()));

如果想在布局中引用:

1 <com.tq.listviewtest.MySurfaceView
2         android:layout_width="match_parent"
3         android:layout_height="match_parent"
4         android:visibility="visible" >
5  </com.tq.listviewtest.MySurfaceView>
1 setContentView(R.layout.activity_main);

则构造方法应改为:

android SurfaceView绘制 重新学习--基础绘制android SurfaceView绘制 重新学习--基础绘制
 1 public MySurfaceView(Context context) {
 2         this(context, null);
 3     }
 4 
 5     public MySurfaceView(Context context, AttributeSet attrs) {
 6         super(context, attrs);
 7         sfh = this.getHolder();
 8         sfh.addCallback(this);
 9         paint = new Paint();
10         paint.setAntiAlias(true);
11         paint.setColor(Color.RED);
12         paint.setTextSize(20);
13         Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
14         paint.setTypeface(font);
15         this.setKeepScreenOn(true);
16     }
View Code

因为android 加载布局时,只是去执行了第二个构造方法,第一个构造方法没有执行,所以我们要把初始化写在第二个构造方法中了。