灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:6091回复:0

Android SurfaceView 详解(三)

楼主#
更多 发布于:2012-09-06 14:01

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的专栏

喜欢0 评分0
游客

返回顶部