SurfaceView 示波器的例子:直接上代码了就
该程序会根据单击的按钮在屏幕上自动绘制正弦波和余弦波形。程序每次绘制时只需要绘制(更新)当前点的波形,前面已经绘制的波形无须更新,利用了SurfaceHolder的lockCanvas(Rect r)方法
1.布局文件Layout/show_wave.xml:
[html]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:
Android="http://schemas.
Android.com/apk/res/
Android"
Android:orientation ="vertical"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<Button
Android:id="@+id/sin"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="正弦曲线"
/>
<Button
Android:id="@+id/cos"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="余弦曲线"
/>
<SurfaceView
Android:id="@+id/show"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
/>
</LinearLayout>
2.主界面Activity:ShowWave
[
java]
package com.infy.configuration;
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.view.SurfaceHolder;
import
Android.view.SurfaceView;
import
Android.view.View;
import
Android.view.SurfaceHolder.Callback;
import
Android.view.View.OnClickListener;
import
Android.widget.Button;
public class ShowWave extends Activity{
private SurfaceHolder holder;
private Paint paint;
final int HEIGHT=320;
final int WIDTH=320;
final int X_OFFSET = 5;
private int cx = X_OFFSET;
//实际的Y轴的位置
int centerY = HEIGHT /2;
Timer timer = new Timer();
TimerTask task = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show_wave);
final SurfaceView surface = (SurfaceView)findViewById(R.id.show);
//初始化SurfaceHolder对象
www.atcpu.com holder = surface.getHolder();
paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(3);
Button sin =(Button)findViewById(R.id.sin);
Button cos =(Button)findViewById(R.id.cos);
OnClickListener listener = (new OnClickListener() {
@Override
public void onClick(final View source) {
// TODO Auto-generated method stub
drawBack(holder);
cx = X_OFFSET;
if(task != null){
task.cancel();
}
task = new TimerTask() {
@Override
public void run() {
int cy = source.getId() == R.id.sin ? centerY -(int)(100 * Math.sin((cx -5) *2 * Math.PI/150)):
centerY -(int)(100 * Math.cos((cx-5)*2*Math.PI/150));
Canvas canvas = holder.lockCanvas(new Rect(cx,cy-2,cx+2,cy+2));
canvas.drawPoint(cx, cy, paint);
cx++;
if(cx >WIDTH){
task.cancel();
task = null;
}
holder.unlockCanvasAndPost(canvas);
}
};
timer.schedule(task, 0,30);
}
});
sin.setOnClickListener(listener);
cos.setOnClickListener(listener);
holder.addCallback(new Callback() {
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){
drawBack(holder);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
timer.cancel();
}
});
}
private void drawBack(SurfaceHolder holder){
Canvas canvas = holder.lockCanvas();
//绘制白色背景
canvas.drawColor(Color.WHITE);
Paint p = new Paint();
p.setColor(Color.BLACK);
p.setStrokeWidth(2);
//绘制坐标轴
canvas.drawLine(X_OFFSET, centerY, WIDTH, centerY, p);
canvas.drawLine(X_OFFSET, 40, X_OFFSET, HEIGHT, p);
holder.unlockCanvasAndPost(canvas);
holder.lockCanvas(new Rect(0,0,0,0));
holder.unlockCanvasAndPost(canvas);
}
}
3.最后显示结果:
a.正弦曲线
b.余弦曲线:
摘自 Damon_tong的专栏