众所周知,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显示正弦曲线,仿造示波器相关推荐

  1. 利用GridView显示主细表并一次编辑明细表所有数据的例子

    全部代码如下: ASPX: <%@ Page Language="C#" ValidateRequest="false" AutoEventWireup= ...

  2. uart口图片_uart 加强了的串口调试助手,可以自动记录传输数据,并且显示图片,示波器等功能 Com Port 编程 267万源代码下载- www.pudn.com...

    文件名称: uart下载  收藏√  [ 5  4  3  2  1 ] 开发工具: C# 文件大小: 10479 KB 上传时间: 2014-06-06 下载次数: 62 提 供 者: 林元峰 详细 ...

  3. 利用LCD1602显示超声波测距

    利用LCD1602显示超声波测距 介绍 一.需要的器件 二.原理 工程代码 一. LCD1602 二.超声波测距及主程序 运行图 介绍 一.需要的器件 51单片机:任意一款都可以,我这里使用的是STC ...

  4. ffmpeg实战教程(七)Android CMake avi解码后SurfaceView显示

    ffmpeg实战教程(七)Android CMake avi解码后SurfaceView显示 本篇我们实现Android平台解码avi并用SurfaceView播放. 先上图看效果: 思路:  1.把 ...

  5. 利用Cookie显示上次登录时间

    利用Cookie显示上次登录时间 1 新建一个web项目,选择2.5版本点击finish. 2 在src下建一个Servlet文件,输入文件名,点击finish完成. 3 在WebContent下建立 ...

  6. C#利用DirectX显示.x三维动画

    C#利用DirectX显示.x三维动画 最开始在研究 四轴/捷联式惯性导航 的时候,想做个三维上位机来玩一下,经大师兄介绍一个阿莫上面帖子: http://www.amobbs.com/forum.p ...

  7. 利用ASP显示当前在线人数

    <a href='http://www.biancheng88.cn/html/2008-11/ASP-ZaiXian7.html'>利用ASP显示当前在线人数</a>< ...

  8. android之利用surfaceView实现自定义水印相机

    android之利用surfaceView实现自定义水印相机 知识点 1.自定义相机+预览相机 2.截屏拍照加水印 3.关于不使用intent来传输图片 4.关于大家说要demo的,因为这里是项目里头 ...

  9. 利用QPixmap显示图片

    利用QPixmap显示图片 我们来实现在窗口上显示图片,并将图片进行平移,缩放,旋转和扭曲.这里我是利用QPixmap类来实现图片显示的. 一.利用QPixmap显示图片. 1.将以前的工程文件夹进行 ...

最新文章

  1. inline-block 间距
  2. Hi3516A开发--编译整个osdrv目录所遇到的问题总结
  3. 关于jupyter几个不得不知道的tips
  4. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.3 ProblemDetails
  5. 为什么技术团队领导者多是后台开发人员
  6. 图论 —— 生成树 —— 次小生成树
  7. 直接选择排序与冒泡排序
  8. python3安装pip3的方法
  9. GDAL源码剖析(四)之命令行程序说明二
  10. .JS replace方法替换所有字符
  11. android 属性翻牌动画,如何在Android中利用TextSwitcher实现一个文字上下翻牌效果
  12. Ping32文档加密软件有哪些特点
  13. C++ DOM读写xml(msxml6)
  14. centos linux7 开启桌面命令,centos7如何在桌面打开终端
  15. Stubs和Mocks区别 (Stubs vs. Mocks)
  16. python三维图旋转_python中的三维图像旋转
  17. Arrays.sort排二维数组
  18. eXtremeTable -
  19. Linux操作系统PS命令详细 解析
  20. Java:apache.poi读写Excel文件

热门文章

  1. Android Handler介绍
  2. 利用bigpipe机制实现页面模块的异步渲染 chunked技术
  3. ZendFramework的介绍、安装和实例运行
  4. windows计算器
  5. 死锁问题分析的利器——valgrind的DRD和Helgrind
  6. Docker容器中挂载NFS共享目录
  7. 【摄像头】宽动态范围
  8. 【linux】串口编程(二)——非阻塞接收
  9. android 官方默认动画,Android动画一:Activity过渡动画详细实现原理
  10. python组成不重复的三位数是多少_Python输出由1,2,3,4组成的互不相同且无重复的三位数...