1.main的xml文件的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="简单绘画" >
</Button>
<Button
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定时器绘画" >
</Button>
</LinearLayout>
<SurfaceView
android:id="@+id/SurfaceView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</SurfaceView>
</LinearLayout>
2.此项目中唯一的Activity的代码如下:
package com.testSurfaceView;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
public class TestSurfaceView extends Activity {
//点击左边的按钮正弦波一次性画完,点击右边的按钮正弦波逐渐画完
Button btnSimpleDraw, btnTimerDraw;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
private Timer mTimer;
private MyTimerTask myTimerTask;
int Y_axis[],// 保存正弦波的Y 轴上的点
centerY,// SurfaceView 垂直中间位置Y坐标轴的坐标
oldX, oldY,// 上一个XY 点
currentX;// 当前绘制到的X 轴上的点
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSimpleDraw = (Button) this.findViewById(R.id.Button01);
btnTimerDraw = (Button) this.findViewById(R.id.Button02);
btnSimpleDraw.setOnClickListener(new ClickEvent());
btnTimerDraw.setOnClickListener(new ClickEvent());
surfaceView = (SurfaceView) this.findViewById(R.id.SurfaceView01);
surfaceHolder = surfaceView.getHolder();
// 动态绘制正弦波的定时器
mTimer = new Timer();
myTimerTask = new MyTimerTask();
// 初始化y 轴数据
centerY = (getWindowManager().getDefaultDisplay().getHeight() - surfaceView
.getTop()) / 2;
Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()];
for (int i = 1; i < Y_axis.length; i++) {// 计算正弦波
Y_axis[i - 1] = centerY - (int) (100 * Math.sin(i * 2 * Math.PI / 180));
}
}
class ClickEvent implements View.OnClickListener {
@Override
public void onClick(View v) {
if (v == btnSimpleDraw) {
mTimer.cancel();
mTimer.purge();
myTimerTask = null;
ClearDraw();
oldX = 0;
oldY = 0;
SimpleDraw(Y_axis.length - 1);// 直接绘制正弦波
}
else if (v == btnTimerDraw) {
if (myTimerTask == null) {
ClearDraw();
mTimer = new Timer();
currentX = 0;
myTimerTask = new MyTimerTask();
mTimer.schedule(myTimerTask, 0, 5);// 动态绘制正弦波
}
}
}
}
class MyTimerTask extends TimerTask {
@Override
public void run() {
SimpleDraw(currentX);
currentX++;// 往前进
if (currentX == Y_axis.length - 1) {// 如果到了终点,则清屏重来
ClearDraw();
currentX = 0;
oldY = centerY;
}
}
}
/*
* 绘制指定区域
*/
void SimpleDraw(int length) {
if (length == 0)
oldX = 0;
Canvas canvas = surfaceHolder.lockCanvas(new Rect(oldX, 0, oldX + length,
getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布,先锁定画布
Log.i("Canvas:", String.valueOf(oldX) + "," + String.valueOf(oldX + length));
Paint mPaint = new Paint();
mPaint.setColor(Color.GREEN);// 画笔为绿色
mPaint.setStrokeWidth(2);// 设置画笔粗细
int y;
for (int i = oldX + 1; i < length; i++) {// 绘画正弦波
y = Y_axis[i - 1];
if (i != 1) {
canvas.drawLine(oldX, oldY, i, y, mPaint);
}
oldX = i;
oldY = y;
}
surfaceHolder.unlockCanvasAndPost(canvas);//绘画完成之后, 解锁画布,提交画好的图像
}
void ClearDraw() {
Canvas canvas = surfaceHolder.lockCanvas(null);
canvas.drawColor(Color.BLACK);// 清除画布
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
3.效果图如下: