Android SurfaceView 详解(三)

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

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

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

 

<?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

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值