Android SurfaceView实现静态于动态画图效果

本文是基于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.   
  20. <Button  
  21.     android:id="@+id/timerdraw_btn"  
  22.     android:layout_width="wrap_content"  
  23.     android:layout_height="wrap_content"  
  24.     android:layout_toRightOf="@id/simpledraw_btn"  
  25.     android:text="定时绘图"   
  26.     android:textSize="20dip"/>  
  27. <Button   
  28.     android:id="@+id/cleardraw_btn"  
  29.     android:layout_width="wrap_content"  
  30.     android:layout_height="wrap_content"  
  31.     android:layout_toRightOf="@id/timerdraw_btn"  
  32.     android:text="清除图像"  
  33.     android:textSize="20dip"/>  
  34. </RelativeLayout>  
  35. </LinearLayout>  

2.SurfaceViewDrawActivity.java

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

转载于:https://www.cnblogs.com/Free-Thinker/p/4750030.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学概念——J - 数论,质因数分解

J - 数论&#xff0c;质因数分解Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit StatusDescription Tomorrow is contest day, Are you all ready? We have been training for 45 days, and all guys must be tired.But , you are…

java黄金分割点游戏_结对编程1——黄金点小游戏项目简介及需求分析

一、项目成员2018141461085龚泽楠2018141461012蔡铧荣二、项目名称黄金点小游戏三、项目简介游戏规则&#xff1a; N个同学( N通常大于 10 )&#xff0c;每人写一个 0~100 之间的有理数 (不包括 0或100) &#xff0c;交给裁判算出所有数字的平均值然后乘以 0.618 (所谓黄金分割…

HDU 2242 考研路茫茫——空调教室

考研路茫茫——空调教室 Time Limit: 2000msMemory Limit: 32768KBThis problem will be judged on HDU. Original ID: 224264-bit integer IO format: %I64d Java class name: Main众所周知&#xff0c;HDU的考研教室是没有空调的&#xff0c;于是就苦了不少不去图书馆的…

java 正则表达式 组合_java基础:5.1 面向对象、类的关联 聚合 组合、正则表达式...

上一个礼拜太忙了&#xff0c;今天开始恢复java的学习~目录1、面向过程——面向对象的区别传统的面向过程式编程是动作驱动的&#xff0c;数据和动作是分离的。面向对象编程的范式重点在于对象&#xff0c;动作和数据一起定义在对象中。面向过程的范式重点在于设计方法。面向对…

html5学习之路_003

html布局 使用<div>元素布局使用<table>元素布局<div>元素布局 <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>div布局</title><link rel"stylesheet" type&qu…

变量不合法的表达式JAVA_Java8中lambda表达式的语法,别人都会的,你还不会吗?「一」...

函数式编程函数式编程是一种编程方式&#xff0c;它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus)&#xff0c;λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 函数式编程是"结构化编程"的一种&#xff0c;主要思想是把运…

动手制作属于你自己的WIN PE3.0

最近想要更新公司的网Ghost系统&#xff0c;所以小研究一下win pe &#xff0c;在网上看见一个很不错的教程&#xff0c;在这里分享给大家&#xff01;并非原创&#xff0c;纯属转载&#xff01;&#xff01;O(∩_∩)O~天缘的作品&#xff0c;很是佩服这个哥们啊.....一、WINPE…

python图像处理模糊_Python+OpenCV图像处理之模糊操作

模糊操作是图像处理中最简单和常用的操作之一&#xff0c;该使用的操作之一原因就为了给图像预处理时减低噪声&#xff0c;基于数学的卷积操作均值模糊&#xff0c;函数 cv2.blur(image,(5,5))&#xff0c;这是一个平滑图片的函数&#xff0c;它将一个区域内所有点的灰度值的平…

高斯消元学习

1. 证明XOR满足交换律&#xff0c;结合律&#xff0c;是自身的逆运算。比如说&#xff0c;1^0 1 1^1 0 0^1 1 0^0 01^1^0 0 1^0^1 0.a^b^ab 即一个数异或两次相当于无效 2. 从N个数中选出两个数&#xff0c;使XOR和最大。解法&#xff1a;我们知道两个数字之间的异或…

java经纬度格式_java经纬度格式转换

在数学中&#xff0c;表示角度的度、分、秒分别使用、′、″符号进行表示。160′&#xff0c;1′60″ &#xff0c;13600″。由上述可知度分秒转换度的计算公式为&#xff1a;(ddmm′ss″) ddmm/60ss/3600如&#xff1a;11330′10.25″ 11330/6010.25/3600 ≈113.502847度分秒…

e3是合法浮点数吗_下面4个选项中,均是合法浮点数的选项是?

选B。b中的123是整数&#xff0c;不是浮点数&#xff0c;2e4.2的指数是4.2不满足浮点数的规则必须是整数&#xff0c;e5中的e不满足浮点数的规则&#xff0c;所以b中3个数均不是浮点数。a中的160、0.12是正确的&#xff0c;c中的123e4、0.0是正确的&#xff0c;d中的234、1e3是…

winform 菜单激发窗体切换做法

经常会用到类似于下图这样的winform窗体&#xff0c;其中点击各个菜单时于鏊做到内容窗体的切换&#xff0c;今天也记录一直切换的方法 在主窗体放置一个panal&#xff0c;所有的内容窗体均在改panal上呈现&#xff0c;实现以下方法 ///实例化主窗体 private void FrmSetup_Loa…

java 正则表达式 反向_正则表达式中的数量表示符、反向引用、零宽断言、以及java中的用法...

在表示数量时&#xff0c;如果一个正则表达式X&#xff0c;后面没有加表示数量的符号&#xff0c;那就默认出现一次。如果指定需要出现n次&#xff0c;那就用{n}&#xff0c;例如a{n},就是匹配a出现n次的。a{n,}表示a出现至少n次的&#xff0c;而这个时候就会默认是贪婪模式&am…

django配置在MySQL_怎么在Django中安装与配置mysql

怎么在Django中安装与配置mysql发布时间&#xff1a;2021-02-26 17:42:11来源&#xff1a;亿速云阅读&#xff1a;57作者&#xff1a;Leah本篇文章为大家展示了怎么在Django中安装与配置mysql&#xff0c;内容简明扼要并且容易理解&#xff0c;绝对能使你眼前一亮&#xff0c;通…

Java字符串找出4个字节长度的字符

不解释&#xff0c;直接上代码&#xff1a; 由于Iteye代码贴四个字节的&#xff35;&#xff34;&#xff26;&#xff0d;&#xff18;字符出错&#xff0c;特能图的方式发布几个特殊字符&#xff1a; Java代码 public class Byte4Check { public static void main…

div 左右并排,使用CSS如何让两个div并排显示

用CSS如何让两个DIV盒子并排体现呢&#xff1f;各人知道默认情况下DIV是独占一排的&#xff0c;DIV不设置任何CSS格局&#xff0c;这个DIV盒子都邑独有一行踊跃换行。运用CSS让两个DIV并排闪现&#xff0c;排成一排显示思空见贯方式有两种&#xff1a;1、运用display:inline2、…

JStorm-介绍

1.概述 JStorm 是一个类似于 Hadoop 的MapReduce的计算系统&#xff0c;它是由Alibaba开源的实时计算模型&#xff0c;它使用Java重写了原生的Storm模型&#xff08;Clojure和Java混合编写的&#xff09;&#xff0c;并且再原来的基础上做了许多改进。用户只需按照指定的接口实…

又一个绝对棒的对话框插件fancybox v1.3.4

http://www.jsfoot.com/jquery/demo/2011-07-30/fancybox/index.html jquery插件&#xff1a;fancybox Fancybox的特点如下&#xff1a; 可以支持图片、html文本、flash动画、iframe以及ajax的支持可以自定义播放器的CSS样式可以以组的形式进行播放如果将鼠标滚动插件&#xff…

php this validate,php扩展ZF——Validate扩展

php扩展ZF——Validate扩展更新时间&#xff1a;2008年01月10日 20:27:49 作者&#xff1a;php扩展ZF——Validate扩展之前写了一片文章关于如何在ZF0.6版本下扩展ZF的。这篇应该说是类似的文章&#xff0c;但环境换成ZF1.0RC1版本了。在开始ZF扩展之前&#xff0c;推荐先看看…

浅谈数据结构-选择排序(简单、堆排序)

选择排序&#xff1a;每趟从待排序的记录中选出关键字最小的记录&#xff0c;顺序放在已排序的记录序列末尾&#xff0c;直到全部排序结束为止。 选择排序正如定义所讲&#xff0c;在数组查询出最小值&#xff0c;然后放在此次循环开始位置&#xff08;前一次循环已经获取比它更…