利用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
利用SurfaceView显示正弦曲线,仿造示波器相关推荐
- 利用GridView显示主细表并一次编辑明细表所有数据的例子
全部代码如下: ASPX: <%@ Page Language="C#" ValidateRequest="false" AutoEventWireup= ...
- uart口图片_uart 加强了的串口调试助手,可以自动记录传输数据,并且显示图片,示波器等功能 Com Port 编程 267万源代码下载- www.pudn.com...
文件名称: uart下载 收藏√ [ 5 4 3 2 1 ] 开发工具: C# 文件大小: 10479 KB 上传时间: 2014-06-06 下载次数: 62 提 供 者: 林元峰 详细 ...
- 利用LCD1602显示超声波测距
利用LCD1602显示超声波测距 介绍 一.需要的器件 二.原理 工程代码 一. LCD1602 二.超声波测距及主程序 运行图 介绍 一.需要的器件 51单片机:任意一款都可以,我这里使用的是STC ...
- ffmpeg实战教程(七)Android CMake avi解码后SurfaceView显示
ffmpeg实战教程(七)Android CMake avi解码后SurfaceView显示 本篇我们实现Android平台解码avi并用SurfaceView播放. 先上图看效果: 思路: 1.把 ...
- 利用Cookie显示上次登录时间
利用Cookie显示上次登录时间 1 新建一个web项目,选择2.5版本点击finish. 2 在src下建一个Servlet文件,输入文件名,点击finish完成. 3 在WebContent下建立 ...
- C#利用DirectX显示.x三维动画
C#利用DirectX显示.x三维动画 最开始在研究 四轴/捷联式惯性导航 的时候,想做个三维上位机来玩一下,经大师兄介绍一个阿莫上面帖子: http://www.amobbs.com/forum.p ...
- 利用ASP显示当前在线人数
<a href='http://www.biancheng88.cn/html/2008-11/ASP-ZaiXian7.html'>利用ASP显示当前在线人数</a>< ...
- android之利用surfaceView实现自定义水印相机
android之利用surfaceView实现自定义水印相机 知识点 1.自定义相机+预览相机 2.截屏拍照加水印 3.关于不使用intent来传输图片 4.关于大家说要demo的,因为这里是项目里头 ...
- 利用QPixmap显示图片
利用QPixmap显示图片 我们来实现在窗口上显示图片,并将图片进行平移,缩放,旋转和扭曲.这里我是利用QPixmap类来实现图片显示的. 一.利用QPixmap显示图片. 1.将以前的工程文件夹进行 ...
最新文章
- inline-block 间距
- Hi3516A开发--编译整个osdrv目录所遇到的问题总结
- 关于jupyter几个不得不知道的tips
- 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.3 ProblemDetails
- 为什么技术团队领导者多是后台开发人员
- 图论 —— 生成树 —— 次小生成树
- 直接选择排序与冒泡排序
- python3安装pip3的方法
- GDAL源码剖析(四)之命令行程序说明二
- .JS replace方法替换所有字符
- android 属性翻牌动画,如何在Android中利用TextSwitcher实现一个文字上下翻牌效果
- Ping32文档加密软件有哪些特点
- C++ DOM读写xml(msxml6)
- centos linux7 开启桌面命令,centos7如何在桌面打开终端
- Stubs和Mocks区别 (Stubs vs. Mocks)
- python三维图旋转_python中的三维图像旋转
- Arrays.sort排二维数组
- eXtremeTable -
- Linux操作系统PS命令详细 解析
- Java:apache.poi读写Excel文件
热门文章
- Android Handler介绍
- 利用bigpipe机制实现页面模块的异步渲染 chunked技术
- ZendFramework的介绍、安装和实例运行
- windows计算器
- 死锁问题分析的利器——valgrind的DRD和Helgrind
- Docker容器中挂载NFS共享目录
- 【摄像头】宽动态范围
- 【linux】串口编程(二)——非阻塞接收
- android 官方默认动画,Android动画一:Activity过渡动画详细实现原理
- python组成不重复的三位数是多少_Python输出由1,2,3,4组成的互不相同且无重复的三位数...