当前位置: 首页 > 编程日记 > 正文

利用SurfaceView显示正弦曲线,仿造示波器

众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡顿的感觉;而如果执行的操作逻辑太多,特别是需要频繁刷新的界面,就会不断阻塞主线程,从而导致画面卡顿。

因此Android提供了surfaceView。

1.View主要适用于主动更新的情况,surfaceView主要适用于被动更新,例如频繁的刷新。

2.View在主线程 中对View进行刷新,surfaceView通常会用一个子线程来进行页面的刷新。

3.View在绘图时没有双缓冲机制,而surfaceView在底层就已经实现了双缓冲机制。

因此如果自定义view需要频繁刷新或者刷新时候的数据处理量比较大,那么就可以考虑使用surfaceView来代替View

使用SurfaceeView有一套模板,以下用一个例子说明:用surfaceView做出示波器的效果,画出正弦波。

package com.example.tangzh.MyView;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;import com.example.tangzh.mylearn.R;/*** Created by TangZH on 2017/4/30.*/
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable //继承并实现两个接口
{private SurfaceHolder mHolder;//用于绘图的Canvasprivate Canvas mCanvas;//子线程标志位private boolean mIsDrawing;//画笔private Paint mPaint;private Path mPath;//x坐标private int x=0;//y坐标private int y=400;public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr){super(context, attrs, defStyleAttr);initView();}public MySurfaceView(Context context){super(context);initView();}public MySurfaceView(Context context, AttributeSet attrs){super(context, attrs);initView();}private void initView(){mHolder=getHolder();mHolder.addCallback(this);setFocusable(true);setFocusableInTouchMode(true);this.setKeepScreenOn(true);}@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {mIsDrawing=true;mPath=new Path();mPath.moveTo(0,400);mPaint=new Paint();mPaint.setColor(getResources().getColor(R.color.colorTheme));mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(5);new Thread(this).start();}@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {}@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder) {mIsDrawing=false;}@Overridepublic void run() {while (mIsDrawing){draw();x+=5;y=(int)(100* Math.sin(x*2*Math.PI/180)+400);mPath.lineTo(x,y);}}private void draw() {try {mCanvas=mHolder.lockCanvas();//SurfaceView背景
            mCanvas.drawColor(Color.WHITE);mCanvas.drawPath(mPath,mPaint);}catch (Exception e){e.printStackTrace();}finally {if(mCanvas!=null)mHolder.unlockCanvasAndPost(mCanvas); //对画布内容进行提交
        }}
}


要注意,通过SurfaceView对象的lockCanvas()方法,就可以获取当前的Canvas绘图对象,这个对象跟上次的Canvas对象是同一个,因此之前的绘图操作都会被保留,如果需要擦出,则可以在绘制前,通过drawColor()方法来进行清屏操作。

转载于:https://www.cnblogs.com/tangZH/p/6791556.html

相关文章:

如何使用OWASP Dependency Check的命令行(CLI)模式进行依赖库安全漏洞扫描

OWASP Dependency Check是一款用于识别项目的依赖项是否有已知漏洞的工具,本文介绍一下如何使用Dependency Check工具的命令行模式进行依赖库漏洞扫描。 【下载地址】:安装包下载 【环境要求】: 操作系统:centos7.5 【使用方法…

E8.Net 2005工作流平台版本发布

2007年2月,完成了EPowerFlow.Net2003版本升级到E8.Net2005版本的工作,今后E8.Net工作流平台就可以使用Microsoft Visual Studio 2005(SP1)的进行应用开发了。EPowerFlow.Net2003版本将继续保留一段时间,未来将全面推广E8.Net2005版本。E8.Net…

设计模式系列·抽象工厂模式

前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列王小二需求历险记(一)设计模式系列王小二需求历险记(二)设计模式系列封装、继承、多态设计模式系列初探设计模式之王小二的疑问设计模式系列Facad…

14级团队学习成果汇报 -- 利用express+socket.io搭建简易版聊天室

周鹏,14级数理系,信息与计算科学大三学生。在LSGO软件技术团队负责前端部分,本图文是他的一个完整作品,代码可在Github上下载。

String复习笔记

注:可以在我的下载中下载完整word版 我的String学习体系 不可变 常见操作 补充:重载 在变成连接符String s "abc"24"haha";格式化输出 thinking in java 的例子 StringBuffer 简介 常见操作

面向对象模型的四种核心技术

1、分类类是具有相同属性结构和操作方法的对象的集合,属于同一类的对象具有相同的属性结构和操作方法。分类是把一组具有相同属性结构和操作方法的对象归纳或映射为一个公共类的过程。对象和类的关系是“实例”(instance-of)的关系。同一个类中的若干个对象&#xf…

Matlab与线性代数 -- 线性间隔向量

这段时间有同学给我后台留言,希望能够推送与Matlab相关的内容,本学期该微信号承担了数理系信息教研室线性代数课程内容推送和通知的任务,想来想去,就以此为契机,把Matlab和线性代数的内容结合起来吧,希望对…

盖茨基金会:如何使用Python拯救生命

每年全球都要花费数十亿美元来预防疾病,减少死亡,资助预防保健及治疗的各种研发项目,以及其他的健康方案。但资金毕竟是有限的,所以一些组织,比如全球卫生资金的主要捐助者比尔&梅林达盖茨基金会(Billa…

正则表达式复习笔记

注:可以在我的下载中下载完整word版 复习体系 简介 正则表达式是:符合一定规则的表达式。 作用:用于专门操作字符串。 特点:用一些特定的符号来表示一些代码操作。这样就简化书写。 所以学习正则表达式,就是在学习一些特殊符号…

规划文章的“显示效果”,还是太多犹豫。

现在的一篇文章可能有“带图片”(现称焦点),头条(可能要重新命名标题),有几种显示效果的情况怎么办?把头条和焦点规划到一起来?想不出一个比较好的解决方案。初步准备“一对多”。先…

Matlab与线性代数 -- 方阵的行列式

这段时间有同学给我后台留言,希望能够推送与Matlab相关的内容,本学期该微信号承担了数理系信息教研室线性代数课程内容推送和通知的任务,想来想去,就以此为契机,把Matlab和线性代数的内容结合起来吧,希望对…

《深入浅出iPhone/iPad开发(第2版)》——在Xcode中建立你的界面

本节书摘来自异步社区《深入浅出iPhone/iPad开发(第2版)》一书中的在Xcode中建立你的界面,作者 【美】Dan Pilone , Tracey Pilone,更多章节内容可以访问云栖社区“异步社区”公众号查看 在Xcode中建立你的界面深入浅出iPhone/iPa…

Struts2+spring+jdbc 以xml配置形式整合

今天做作业&#xff0c;练习一下Struts2springjdbc 以xml配置形式整合 整合步骤&#xff1a; 工程结构图&#xff1a; 重要配置文件 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app version"2.5" xmlns"http://java.…

我和你不了的故事

我和你不了的故事——代腾飞 2006年12月11日 于成都你无言告别而消失得无影无踪我的世界只留下了你昔日的背影从此你我相隔在不远不近的时空里然而我却失去了你所有的联系你带走的是我们在一起的欢歌笑语为我留下的却是思念的苦楚和美妙而难忘的回忆不知此时的你是否偶尔能把…

前后端分离的探索(四)

文桥&#xff0c;13级机械电子工程系&#xff0c;大四学生。在LSGO软件技术团队负责前端部分&#xff0c;本图文是介绍目前流行的前后端分离技术的第四篇&#xff08;一共六篇&#xff09;&#xff0c;希望大家能够对这块有所了解。

《Adobe Fireworks CS5中文版经典教程》——导读

前言Adobe Fireworks CS5是一款专业级图像处理应用程序&#xff0c;融矢量和位图处理功能于一身。之所以采取独特的图像处理方法&#xff0c;是由于Fireworks旨在让用户能够创建和处理屏幕图形&#xff0c;以供Web或诸如移动应用程序和Adobe Flash等基于屏幕的工具使用。Firewo…

使用wsimport生成本地调用代码

使用wsimport生成本地调用的步骤 wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具. wsimport.exe位于JAVA_HOME\bin目录下. 常用参数为: -d<目录> - 将生成.class文件。默认参数。 -s<目录> - 将生成.java文件。 -p<生成的新包名> -将生成的…

单片机练习-RC-5红外遥控器程序及简单制造DIY PC遥控器

本程序采用的芯片为SAA3010, 参考资料有:1. 常用红外遥控接收头引脚图解2. 红外遥控编码资料3. RC-5红外遥控程序 4. GIRDER中文教程与电脑遥控器制作资料 5. Girder网站 (一个需要钱买的遥控)6. 再度出击&#xff0c;20元打造经典PC遥控器&#xff01;7. SAA3010 DataSheet这次…

《iOS9开发快速入门》——导读

本节书摘来自异步社区《iOS9开发快速入门》一书中的目录&#xff0c;作者 刘丽霞 , 邱晓华&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录前 言 第1章 iOS 9开发概述 1.1 iOS 9新特性 1.2 构建开发环境—Xcode 7.0 1.3 编写第一个iOS 9应用 1.4 小…

C#语言与面向对象技术(4)

本图文主要掌握以下问题&#xff1a; 1. 为什么要引入属性的概念&#xff1f; 2. 属性的get与set方法是怎样定义的&#xff1f; 3. 什么是索引器&#xff1f; 4. 索引器是如何实现的&#xff1f;

使用wsdl2java命令生成webservice本地调用代码

使用wsdl2java命令生成webservice本地调用代码 如果没有设置环境变量&#xff0c;就要先进入cxf的bin目录 例子&#xff1a; wsdl2java -d . http://localhost:7890/hello?wsdl 它包含以下参数&#xff1a; &#xff0d;d参数&#xff0c;指定代码生成的目录。 &#xff0d…

js表单验证大全

js验证表单大全1. 长度限制<script>function test() {if(document.a.b.value.length>50){alert("不能超过50个字符&#xff01;");document.a.b.focus();return false;}}</script><form namea οnsubmit"return test()"><textarea…

《为iPad而设计:打造畅销App》——大胆创意

本节书摘来自异步社区《为iPad而设计&#xff1a;打造畅销App》一书中的大胆创意作者【英】Chris Stevens&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 大胆创意为iPad而设计&#xff1a;打造畅销App其他的应用开发者都在做什么呢&#xff1f;或许应该在应…

Matlab与线性代数 -- 对数化间隔向量

这段时间有同学给我后台留言&#xff0c;希望能够推送与Matlab相关的内容&#xff0c;本学期该微信号承担了数理系信息教研室线性代数课程内容推送和通知的任务&#xff0c;想来想去&#xff0c;就以此为契机&#xff0c;把Matlab和线性代数的内容结合起来吧&#xff0c;希望对…

ContentProvider访问问题

问题解决一&#xff1a; 写了一个类&#xff0c;实现了ContentProvider&#xff0c;在清单文件中也注册了。 <provider android:name".provider.MyProvider" android:authorities"mytest" /> 但是访问的时候出现异常&#xff1a; j…

《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...

本节书摘来自异步社区出版社《C面向对象高效编程&#xff08;第2版&#xff09;》一书中的第3章&#xff0c;第3.11节&#xff0c;作者&#xff1a; 【美】Kayshav Dattatri&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 3.11 类名、成员函数名、参数类型…

一个GDIPlus的Bug -- OutofMemory异常

今天发现 framework2.0中的一个GDIPlus的Bug: 在Form的OnPaint事件里面写如下代码&#xff1a; private void Form1_Paint(object sender, PaintEventArgs e) { Pen p new Pen(Color.Red); p.Width 1; p.DashStyle DashStyl…

前后端分离的探索(五)

文桥&#xff0c;13级机械工程系&#xff0c;机械电子工程专业&#xff0c;大四学生。在LSGO软件技术团队负责前端部分&#xff0c;本图文是介绍目前流行的前后端分离技术的第五篇&#xff08;一共六篇&#xff09;&#xff0c;希望大家能够对这块有所了解。

从一道面试题分析Thread.interrupt方法

阿里面试题&#xff1a; public class TestThread {public static void main(String[] args) {Thread t1 new Thread() {Overridepublic void run() {try {int i 0;while (i < 100000000) {// nothing}System.out.println("A1");} catch (Exception e) {System.…

对联广告,带关闭,可以移动

在网页中加入以下代码 两个图的&#xff0c;一个是关闭用到的&#xff0c;一个是广告图 <script languageJavaScript src"js/scroll.js"></script> js代码如下&#xff1a; suspendcode"<DIV idlovexin1 styleZ-INDEX: 10; LEFT: 6px; POSITION…