本文是基于Android的SurfaceView的动态画图效果,实现静态和动态下的正弦波画图,可作为自己做图的简单参考,废话不多说,先上图,

静态效果:

动态效果:

比较简单,代码注释的也比较详细,易懂,我就直接上代码了吧:

1.main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <SurfaceView
  7. android:layout_width="fill_parent"
  8. android:layout_height="600px"
  9. android:id="@+id/surfaceview_draw"/>
  10. <RelativeLayout android:layout_width="fill_parent"
  11. android:layout_height="wrap_content">
  12. <Button android:layout_below="@id/surfaceview_draw"
  13. android:layout_marginLeft="7dip"
  14. android:id="@+id/simpledraw_btn"
  15. android:text="简单绘图"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:textSize="20dip"/>
  19. <Button
  20. android:id="@+id/timerdraw_btn"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_toRightOf="@id/simpledraw_btn"
  24. android:text="定时绘图"
  25. android:textSize="20dip"/>
  26. <Button
  27. android:id="@+id/cleardraw_btn"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_toRightOf="@id/timerdraw_btn"
  31. android:text="清除图像"
  32. android:textSize="20dip"/>
  33. </RelativeLayout>
  34. </LinearLayout>

2.SurfaceViewDrawActivity.java

  1. package com.huangcheng.draw;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.app.Activity;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.graphics.Rect;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.SurfaceHolder;
  12. import android.view.SurfaceView;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. public class SurfaceViewDrawActivity extends Activity {
  17. /** Called when the activity is first created. */
  18. private SurfaceView surface_draw;
  19. private SurfaceHolder surfaceholder;
  20. private Button simpledraw_btn;
  21. private Button timerdraw_btn;
  22. private Button cleardraw_btn;
  23. private Timer timer;
  24. private TimerTask timertask;
  25. private int[] Y;// 保存图像Y轴上的点
  26. private int centerY, oldX, oldY, currentX;// 保存水平中心线位置,上一个(x,y)点,当先绘制到的x
  27. ;
  28. @Override
  29. public void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.main);
  32. surface_draw = (SurfaceView) findViewById(R.id.surfaceview_draw);
  33. surfaceholder = surface_draw.getHolder();
  34. simpledraw_btn = (Button) findViewById(R.id.simpledraw_btn);
  35. timerdraw_btn = (Button) findViewById(R.id.timerdraw_btn);
  36. cleardraw_btn = (Button) findViewById(R.id.cleardraw_btn);
  37. cleardraw_btn.setEnabled(false);
  38. centerY = ;
  39. Y = new int[getWindowManager().getDefaultDisplay().getWidth()];
  40. ; i < Y.length + ; i++) {
  41. Y[i - ] = centerY + ( * Math.sin(i *  * Math.PI / ));
  42. // System.out.println("sin:"+100*Math.sin(i*2*Math.PI/180));
  43. }
  44. simpledraw_btn.setOnClickListener(new OnClickListener() {
  45. @Override
  46. public void onClick(View arg0) {
  47. // TODO Auto-generated method stub
  48. simpledraw();// 静态绘制正弦图
  49. signal=;
  50. simpledraw_btn.setEnabled(false);
  51. timerdraw_btn.setEnabled(false);
  52. cleardraw_btn.setEnabled(true);
  53. }
  54. });
  55. timerdraw_btn.setOnClickListener(new OnClickListener() {
  56. @Override
  57. public void onClick(View arg0) {
  58. // TODO Auto-generated method stub
  59. oldX=;
  60. oldY=centerY;
  61. currentX=;
  62. timer=new Timer();
  63. timertask=new TimerTask() {
  64. @Override
  65. public void run() {
  66. // TODO Auto-generated method stub
  67. currentX++;
  68. complexdraw(currentX);
  69. ){
  70. ClearDraw();
  71. currentX = ;
  72. oldX=;
  73. oldY=centerY;
  74. }
  75. }
  76. };
  77. timer.schedule(timertask, , );// 动态绘制正弦图
  78. signal=;
  79. simpledraw_btn.setEnabled(false);
  80. timerdraw_btn.setEnabled(false);
  81. cleardraw_btn.setEnabled(true);
  82. }
  83. });
  84. cleardraw_btn.setOnClickListener(new OnClickListener() {
  85. @Override
  86. public void onClick(View arg0) {
  87. // TODO Auto-generated method stub
  88. ){
  89. ClearDraw();
  90. simpledraw_btn.setEnabled(true);
  91. timerdraw_btn.setEnabled(true);
  92. }
  93. ){
  94. timertask.cancel();
  95. timer.cancel();
  96. ClearDraw();
  97. simpledraw_btn.setEnabled(true);
  98. timerdraw_btn.setEnabled(true);
  99. }
  100. }
  101. });
  102. }
  103. // 简单画图
  104. void simpledraw() {
  105. oldX = ;
  106. oldY = centerY;
  107. Canvas canvas = surfaceholder
  108. .lockCanvas(, oldX + Y.length,
  109. getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布
  110. Log.i("Canvas:X:",
  111. String.valueOf(oldX) + "," + String.valueOf(oldX + Y.length));
  112. Paint mPaint = new Paint();
  113. mPaint.setColor(Color.GREEN);// 画笔为绿色
  114. mPaint.setStrokeWidth();// 设置画笔粗细
  115. int y;
  116. ; i < Y.length; i++) {// 绘画正弦波
  117. y = Y[i - ];
  118. canvas.drawLine(oldX, oldY, i, y, mPaint);
  119. // System.out.println("oldX:"+oldX+" oldY:"+oldY+",x:"+i+" y:"+y);
  120. oldX = i;
  121. oldY = y;
  122. }
  123. surfaceholder.unlockCanvasAndPost(canvas);
  124. }
  125. // 消除画得图
  126. void ClearDraw() {
  127. Canvas canvas = surfaceholder.lockCanvas(null);
  128. canvas.drawColor(Color.BLACK);// 清除画布
  129. surfaceholder.unlockCanvasAndPost(canvas);
  130. }
  131. //动态画图
  132. void complexdraw(int current){
  133. Canvas canvas = surfaceholder
  134. .lockCanvas(, current,
  135. getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布
  136. Log.i("Canvas:X:",
  137. String.valueOf(oldX) + "," + String.valueOf(oldX + Y.length));
  138. Paint mPaint = new Paint();
  139. mPaint.setColor(Color.GREEN);// 画笔为绿色
  140. mPaint.setStrokeWidth();// 设置画笔粗细
  141. ];
  142. canvas.drawLine(oldX, oldY, current, y, mPaint);
  143. // System.out.println("oldX:"+oldX+" oldY:"+oldY+",x:"+i+" y:"+y);
  144. oldX = current;
  145. oldY = y;
  146. surfaceholder.unlockCanvasAndPost(canvas);
  147. }
  148. }

Android SurfaceView实现静态于动态画图效果的更多相关文章

  1. 关于Android中Fragment静态和动态加载的方法

    一.静态加载 1.首先创建一个layout布局fragment.xml,里面放要显示和操作的控件 2.创建一个layout布局main1.xml,用来实现页面的跳转(跳转为要实现静态加载的界面) 3. ...

  2. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  3. Android使用SurfaceView实现墨迹天气的风车效果

    SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...

  4. android 静态和动态设置 Receiver的 android:enabled值

    0x 01 前提约束: 0x001 静态检查:指用action限定Intent,并使用包管理器的queryBroadCastReceivers方法,在flags字段置为0时查找ResolveInfo, ...

  5. Android自定义控件 -Canvas绘制折线图(实现动态报表效果)

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas ...

  6. android优化中国风应用、完整NBA客户端、动态积分效果、文件传输、小说阅读器等源码

    Android精选源码 android拖拽下拉关闭效果源码 一款优雅的中国风Android App源码 EasySignSeekBar一个漂亮而强大的自定义view15 android仿蘑菇街,蜜芽宝 ...

  7. Android原理揭秘系列之一动态墙纸

    Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来. 相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与 ...

  8. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  9. Android SurfaceView实战 带你玩转flabby bird (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...

随机推荐

  1. uvalive 3971 - Assemble(二分搜索 + 贪心)

    题目连接:3971 - Assemble 题目大意:有若干个零件, 每个零件给出的信息有种类, 名称, 价格, 质量,  现在给出一个金额, 要求在这个金额范围内, 将每个种类零件都买一个, 并且尽量 ...

  2. [上海] 携程 门票事业部 招聘.NET 架构师 2 名 - V2EX

    [上海] 携程 门票事业部 招聘.NET 架构师 2 名 - V2EX [上海] 携程 门票事业部 招聘.NET 架构师 2 名

  3. 第二种:NSObject

    - (void)viewDidLoad { [super viewDidLoad]; /** * 开启子线程的方式之一:NSObject */ // 第一个参数:selector // 第二个参数:方 ...

  4. cocos2dx的runAction: 反复运行,多个动作连接运行,多个动作同一时候运行的实现

    cocos2dx的 runAction,假设某个动作重复运行用cc.RepeatForever:create, 多个动作连接运行用cc.Sequence:create,多个动作同一时候运行用cc.Sp ...

  5. Python基础 3----文件和网络

    1 Python文件IO 1 标转的输入和输出 print 方法:输出数据到标准的输出 raw_input 方法:标准的输入 2 file文件类 读文件 f = file(文件名, 模式) 有5种模式 ...

  6. eclipse svn2.0.0插件 手动安装方法

    org.tigris.subversion.javahl.ClientException: Unsupported working copy formatsvn: This client is too ...

  7. iOS 开发http post 文件的上传

    iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...

  8. 写一方法用来计算1+2+3+...n,其中n作为参数输入,返回值可以由方法名返回,也可以由参数返回

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. YII重点文件

    yii\di\Containeryii\base\Componentyii\base\Objectyii\base\Configurableyii\web\Applicationyii\base\Ap ...

  10. sed学习笔记整理

    1.sed简介 sed (Stream Editor)是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处 ...