Android SurfaceView 的基本应用

SurfaceView 由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,网上介绍 SurfaceView的用法有很多,写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,我这里就直接在普通的用户界面调用SurfaceHolder的lockCanvas和 unlockCanvasAndPost。

对比下面的第二、三两图,三图用.lockCanvas(null),而二图用.lockCanvas(new Rect(oldX, 0, oldX + length, getWindowManager().getDefaultDisplay().getHeight())),对比一下两个效果,由于二图是按指定Rect绘画,所以效率会比三图的全控件绘画高些,并且在清屏之后 (canvas.drawColor(Color.BLACK))不会留有上次绘画的残留.
 
 
 
 
 
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent" android:layout_height="fill_parent"
4 android:orientation="vertical">
5
6 <LinearLayout android:id="@+id/LinearLayout01"
7 android:layout_width="wrap_content" android:layout_height="wrap_content">
8 <Button android:id="@+id/Button01" android:layout_width="wrap_content"
9 android:layout_height="wrap_content" android:text="简单绘画"></Button>
10 <Button android:id="@+id/Button02" android:layout_width="wrap_content"
11 android:layout_height="wrap_content" android:text="定时器绘画"></Button>
12 </LinearLayout>
13 <SurfaceView android:id="@+id/SurfaceView01"
14 android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView>
15 </LinearLayout>
  1 package com.testSurfaceView;
2
3 import java.util.Timer;
4 import java.util.TimerTask;
5
6 import android.app.Activity;
7 import android.graphics.Canvas;
8 import android.graphics.Color;
9 import android.graphics.Paint;
10 import android.graphics.Rect;
11 import android.os.Bundle;
12 import android.util.Log;
13 import android.view.SurfaceHolder;
14 import android.view.SurfaceView;
15 import android.view.View;
16 import android.widget.Button;
17
18 public class TestSurfaceView extends Activity {
19 /** Called when the activity is first created. */
20 Button btnSimpleDraw, btnTimerDraw;
21 SurfaceView sfv;
22 SurfaceHolder sfh;
23
24 private Timer mTimer;
25 private MyTimerTask mTimerTask;
26 int Y_axis[],//保存正弦波的Y轴上的点
27 centerY,//中心线
28 oldX,oldY,//上一个XY点
29 currentX;//当前绘制到的X轴上的点
30
31 @Override
32 public void onCreate(Bundle savedInstanceState) {
33 super.onCreate(savedInstanceState);
34 setContentView(R.layout.main);
35
36 btnSimpleDraw = (Button) this.findViewById(R.id.Button01);
37 btnTimerDraw = (Button) this.findViewById(R.id.Button02);
38 btnSimpleDraw.setOnClickListener(new ClickEvent());
39 btnTimerDraw.setOnClickListener(new ClickEvent());
40 sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);
41 sfh = sfv.getHolder();
42
43 //动态绘制正弦波的定时器
44 mTimer = new Timer();
45 mTimerTask = new MyTimerTask();
46
47 // 初始化y轴数据
48 centerY = (getWindowManager().getDefaultDisplay().getHeight() - sfv
49 .getTop()) / 2;
50 Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()];
51 for (int i = 1; i < Y_axis.length; i++) {// 计算正弦波
52 Y_axis[i - 1] = centerY
53 - (int) (100 * Math.sin(i * 2 * Math.PI / 180));
54 }
55 }
56
57 class ClickEvent implements View.OnClickListener {
58
59 @Override
60 public void onClick(View v) {
61
62 if (v == btnSimpleDraw) {
63 SimpleDraw(Y_axis.length-1);//直接绘制正弦波
64
65 } else if (v == btnTimerDraw) {
66 oldY = centerY;
67 mTimer.schedule(mTimerTask, 0, 5);//动态绘制正弦波
68 }
69
70 }
71
72 }
73
74 class MyTimerTask extends TimerTask {
75 @Override
76 public void run() {
77
78 SimpleDraw(currentX);
79 currentX++;//往前进
80 if (currentX == Y_axis.length - 1) {//如果到了终点,则清屏重来
81 ClearDraw();
82 currentX = 0;
83 oldY = centerY;
84 }
85 }
86
87 }
88
89 /**
90 * 绘制指定区域
91 */
92 void SimpleDraw(int length) {
93 if (length == 0)
94 oldX = 0;
95 Canvas canvas = sfh.lockCanvas(new Rect(oldX, 0, oldX + length,
96 getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布
97 Log.i("Canvas:",
98 String.valueOf(oldX) + "," + String.valueOf(oldX + length));
99
100 Paint mPaint = new Paint();
101 mPaint.setColor(Color.GREEN);// 画笔为绿色
102 mPaint.setStrokeWidth(2);// 设置画笔粗细
103
104 int y;
105 for (int i = oldX + 1; i < length; i++) {// 绘画正弦波
106 y = Y_axis[i - 1];
107 canvas.drawLine(oldX, oldY, i, y, mPaint);
108 oldX = i;
109 oldY = y;
110 }
111 sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
112 }
113
114 void ClearDraw() {
115 Canvas canvas = sfh.lockCanvas(null);
116 canvas.drawColor(Color.BLACK);// 清除画布
117 sfh.unlockCanvasAndPost(canvas);
118
119 }
120 }



posted @ 2012-03-27 16:55  HUJJ  阅读(302)  评论(0编辑  收藏  举报