你好,游客 登录 注册 搜索
背景:
阅读新闻

Android SurfaceView 详解

[日期:2012-05-26] 来源:Linux社区  作者:tianfeng [字体: ]

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

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

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

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:Android="http://schemas.android.com/apk/res/android"  
  4.   android:orientation ="vertical"  
  5.    
  6.   android:layout_width="wrap_content"  
  7.   android:layout_height="wrap_content">  
  8.     
  9.   <Button  
  10.   android:id="@+id/sin"  
  11.   android:layout_width="wrap_content"  
  12.   android:layout_height="wrap_content"  
  13.   android:text="正弦曲线"  
  14.   />  
  15.   <Button  
  16.   android:id="@+id/cos"  
  17.   android:layout_width="wrap_content"  
  18.   android:layout_height="wrap_content"  
  19.   android:text="余弦曲线"  
  20.   />  
  21.   <SurfaceView  
  22.   android:id="@+id/show"  
  23.   android:layout_width="wrap_content"  
  24.   android:layout_height="wrap_content"  
  25.   />     
  26. </LinearLayout>  

2.主界面Activity:ShowWave

  1. package com.infy.configuration;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6.   
  7.   
  8.   
  9. import android.app.Activity;  
  10. import android.graphics.Canvas;  
  11. import android.graphics.Color;  
  12. import android.graphics.Paint;  
  13. import android.graphics.Rect;  
  14.   
  15. import android.os.Bundle;  
  16. import android.view.SurfaceHolder;  
  17. import android.view.SurfaceView;  
  18. import android.view.View;  
  19. import android.view.SurfaceHolder.Callback;  
  20. import android.view.View.OnClickListener;  
  21. import android.widget.Button;  
  22.   
  23. public class ShowWave extends Activity{  
  24.   
  25.     private SurfaceHolder holder;  
  26.     private Paint paint;  
  27.     final int HEIGHT=320;  
  28.     final int WIDTH=320;  
  29.     final int X_OFFSET = 5;  
  30.     private int cx = X_OFFSET;  
  31.     //实际的Y轴的位置   
  32.     int centerY = HEIGHT /2;  
  33.     Timer timer = new Timer();  
  34.     TimerTask task = null;  
  35.       
  36.     @Override  
  37.     protected void onCreate(Bundle savedInstanceState) {  
  38.         // TODO Auto-generated method stub   
  39.         super.onCreate(savedInstanceState);  
  40.           
  41.         setContentView(R.layout.show_wave);  
  42.           
  43.         final SurfaceView surface = (SurfaceView)findViewById(R.id.show);  
  44.         //初始化SurfaceHolder对象   
  45.         holder = surface.getHolder();  
  46.         paint = new Paint();  
  47.         paint.setColor(Color.GREEN);  
  48.         paint.setStrokeWidth(3);  
  49.           
  50.         Button sin =(Button)findViewById(R.id.sin);  
  51.         Button cos =(Button)findViewById(R.id.cos);  
  52.         OnClickListener listener = (new OnClickListener() {  
  53.               
  54.             @Override  
  55.             public void onClick(final View source) {  
  56.                 // TODO Auto-generated method stub   
  57.             drawBack(holder);  
  58.             cx = X_OFFSET;  
  59.             if(task != null){  
  60.                 task.cancel();  
  61.             }  
  62.               
  63.             task = new TimerTask() {  
  64.                   
  65.                 @Override  
  66.                 public void run() {  
  67.                     int cy = source.getId() == R.id.sin ? centerY -(int)(100 * Math.sin((cx -5) *2 * Math.PI/150)):  
  68.                                    centerY -(int)(100 * Math.cos((cx-5)*2*Math.PI/150));  
  69.                     Canvas canvas = holder.lockCanvas(new Rect(cx,cy-2,cx+2,cy+2));  
  70.                     canvas.drawPoint(cx, cy, paint);  
  71.                     cx++;  
  72.                       
  73.                     if(cx >WIDTH){  
  74.                           
  75.                         task.cancel();  
  76.                         task = null;  
  77.                           
  78.                     }  
  79.                     holder.unlockCanvasAndPost(canvas);  
  80.                 }  
  81.             };  
  82.             timer.schedule(task, 0,30);  
  83.                   
  84.             }  
  85.         });  
  86.           
  87.         sin.setOnClickListener(listener);  
  88.         cos.setOnClickListener(listener);  
  89.         holder.addCallback(new Callback() {  
  90.             public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){  
  91.                 drawBack(holder);  
  92.             }  
  93.   
  94.             @Override  
  95.             public void surfaceCreated(SurfaceHolder holder) {  
  96.                 // TODO Auto-generated method stub   
  97.             }  
  98.   
  99.             @Override  
  100.             public void surfaceDestroyed(SurfaceHolder holder) {  
  101.                 // TODO Auto-generated method stub   
  102.             timer.cancel();   
  103.             }  
  104.               
  105.         });  
  106.       
  107.       
  108.     }  
  109.       
  110.       
  111.     private void drawBack(SurfaceHolder holder){  
  112.         Canvas canvas = holder.lockCanvas();  
  113.         //绘制白色背景   
  114.         canvas.drawColor(Color.WHITE);  
  115.         Paint p = new Paint();  
  116.         p.setColor(Color.BLACK);  
  117.         p.setStrokeWidth(2);  
  118.           
  119.         //绘制坐标轴   
  120.         canvas.drawLine(X_OFFSET, centerY, WIDTH, centerY, p);  
  121.         canvas.drawLine(X_OFFSET, 40, X_OFFSET, HEIGHT, p);  
  122.         holder.unlockCanvasAndPost(canvas);  
  123.         holder.lockCanvas(new Rect(0,0,0,0));  
  124.         holder.unlockCanvasAndPost(canvas);  
  125.           
  126.     }  
  127.       
  128.       
  129. }  

3.最后显示结果:

a.正弦曲线


 

b.余弦曲线:

linux
相关资讯       Android软件开发 
本文评论   查看全部评论 (1)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 1 楼
* hellobear 发表于 2012/7/3 10:47:48
Thanks for sharing!