本文是基于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. android 修改背景色(转)

    修改为黑底白字 修改AndroidManifest.xml把android:theme="@style/AppTheme" 修改为android:theme="@andr ...

  2. poj 1664 put apples(dfs)

    题目链接:http://poj.org/problem?id=1664 思路分析:数据较小,考虑深度优先搜索搜索解空间. 代码如下: #include <iostream> using n ...

  3. Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象,

    Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象, 一.类 在ios中,类的声明和实现时分离的,也就是说不能写在同一个文件中,声明放在 .h文件中,实现放在 .m 文 ...

  4. 怎么在Ubuntu Scope中获取location地址信息

    Location信息对非常多有地址进行搜索的应用来说非常重要.比方对dianping这种应用来说.我们能够通过地址来获取当前位置的一些信息.在这篇文章中,我们来介绍怎样获取Scope架构中的位置信息. ...

  5. Hibernate 多对一

    Hibernate的many-to-one 关联. 具体看配置文件: <?xml version="1.0"?> <!DOCTYPE hibernate-mapp ...

  6. java面向对象中的String类中12种常用的方法

    1.字符串与字符数组的转换 字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变成一个字符串. public class StringAPI ...

  7. 浙江大学2015年校赛B题 ZOJ 3861 Valid Pattern Lock

    这道题目是队友写的,貌似是用暴力枚举出来. 题意:给出一组数,要求这组数在解锁的界面可能的滑动序列. 思路:按照是否能够直接到达建图,如1可以直接到2,但是1不能直接到3,因为中间必须经过一个2. 要 ...

  8. Mysql 连接查询 Mysql支持的连接查询有哪些

    CREATE TABLE `chx` (   `id` VARCHAR(20) NOT NULL,   `name` VARCHAR(50) DEFAULT NULL,   `name2` CHAR( ...

  9. windows下以指定用户访问SMB服务器进行读写

    需求:最近要开发某系统前端界面,但是该系统是部署在linux服务器上,前端是用php开发,实时调试运行需要linux下系统环境支持, 每次修改都需要手动传到服务器上,尤其是debug阶段,每修改一点就 ...

  10. [置顶] hdu3018解题报告--也是白话几笔画学习总结

    1.题意 2.分析难点(结合图形) 1.首先说说题意吧...题意很简单...但是一开始很菜的我就很迷惑..在想啊...题目怎么就会有没有连接边的点呢....因为你每次给出一条边..就把 a,b连接啦. ...