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);

则构造方法应改为:

 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 加载布局时,只是去执行了第二个构造方法,第一个构造方法没有执行,所以我们要把初始化写在第二个构造方法中了。

你可能感兴趣的:(SurfaceView)