博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android SurfaceView 详解(三)
阅读量:4212 次
发布时间:2019-05-26

本文共 3094 字,大约阅读时间需要 10 分钟。

SurfaceView 示波器的例子:直接上代码了就吐舌头

该程序会根据单击的按钮在屏幕上自动绘制正弦波和余弦波形。程序每次绘制时只需要绘制(更新)当前点的波形,前面已经绘制的波形无须更新,利用了SurfaceHolder的lockCanvas(Rect r)方法

1.布局文件Layout/show_wave.xml:

 

2.主界面Activity:ShowWave

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对象		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.余弦曲线:

你可能感兴趣的文章
内核态与用户态
查看>>
使用mingw(fedora)移植virt-viewer
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
C++ 字符串string操作
查看>>
MySQL必知必会 -- 了解SQL和MySQL
查看>>
MySQL必知必会 -- 使用MySQL
查看>>
MySQL必知必会 -- 数据检索
查看>>
MySQL必知必会 -- 排序检索数据 ORDER BY
查看>>
MySQL必知必会 -- 数据过滤
查看>>
MYSQL必知必会 -- 用通配符进行过滤
查看>>
MYSQL必知必会 -- 用正则表达式进行搜索
查看>>
POJ 3087 解题报告
查看>>
POJ 2536 解题报告
查看>>
POJ 1154 解题报告
查看>>
POJ 1661 解题报告
查看>>
POJ 1101 解题报告
查看>>
ACM POJ catalogues[转载]
查看>>
ACM经历总结[转载]
查看>>
C/C++文件操作[转载]
查看>>
专业计划
查看>>