利用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;
//用于绘图的Canvas
private 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);
} @Override
public 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();
} @Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mIsDrawing=false;
} @Override
public 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()方法来进行清屏操作。
利用SurfaceView显示正弦曲线,仿造示波器的更多相关文章
- Android自定义surfaceView显示多张图片
我自定义了一个surfaceview,我在上面绘制多张图片,让它能够上下方滚显示图片,但是onMeasure()方法在重写的时候遇到了问题,不知道如何设置它的高度, public class MySu ...
- Android 利用SurfaceView进行图形绘制
SurfaceView使用介绍 SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作. 要使用SurfaceView进行绘制,步骤如下: 1.用SurfaceView ...
- 技巧:利用 Workflow 显示附近的免费 Wi-Fi
得益于 Workflow 自 1.5.3 版本起更新的 Get Content of URL 动作,该 App 的潜力得到了极大的提升.本文分享一种有趣的用法,搜寻附近的免费 Wi-Fi 并择一显示在 ...
- DirectX11 With Windows SDK--08 Direct2D与Direct3D互操作性以及利用DWrite显示文字
前言 注意:从这一章起到后面的所有项目无一例外都利用了Direct2D与Direct3D互操作性,但系统要求为Win10, Win8.x 或 Win7 SP1且安装了KB2670838补丁以支持Dir ...
- 利用shell显示wordcount功能
Shell脚本编程是Linux系统最为核心的技术之一,它能够利用简单的命令来实现一些复杂的功能,同时,由于Linux提供了很多文本处理命令,如grep(grep family), tr, sed, ...
- 利用div显示隐藏实现的分页效果
实现步骤: 1.创建对应切换div <div class="bottom_daohang"> <div class="bottom_daohang_zo ...
- 【Android 多媒体应用】使用MediaCodec解码使用SurfaceView显示视频
1.MainActivity.java import android.app.Activity; import android.os.Bundle; import android.os.Environ ...
- Android: 利用SurfaceView绘制股票滑动直线解决延迟问题
1.背景介绍 最近项目要绘制股票走势图,并绘制能够跟随手指滑动的指示线(Indicator)来精确查看股票价格和日期.如下图所示: 上图中的那条白色直线就是股票的指示线,用来跟随手指精确确定股票的时间 ...
- XML利用接口显示并导入到数据库
//控制器代码 /// <summary> /// 页面 /// </summary> /// <returns></returns> public A ...
随机推荐
- Jquery Ajax Realize whether the user is registered
XMLHttpRequest对象可以在不向服务器提交整个页面的情况下,实现局部更新网页.当页面全部加载完毕后,客户端通过该对象向服务器请求数据,服务器端接受数据并处理后,向客户端反馈数据. XMLHt ...
- Linux主机操作系统加固规范
对于企业来说,安全加固是一门必做的安全措施.主要分为:账号安全.认证授权.协议安全.审计安全.总的来说,就是4A(统一安全管理平台解决方案),账号管理.认证管理.授权管理.审计管理.用漏洞扫描工具 ...
- SPA架构的优点和缺点以及一些思考
SPA是什么? 全称是单页面应用. 一个SPA就是一个WEB应用,它所需的资源(HTML CSS JS等),在一次请求中就加载完成,也就是不需刷新地动态加载. 用术语“单页”就是因为页面在初始化加载后 ...
- 写了2年python,知道 if __name__ == '__main__' 什么意思吗?
相信刚接触Python的你一定有过如此经历,把所有的代码都写在 if __name__ == '__main__'下,因为有人告诉你,这样比较符合 Pythonista 的代码风格. 殊不知这段代码的 ...
- Unity 5 使用Roslyn编译器支持C# 7
Unity 2017可选使用新的Mono编译器,支持.NET 4.6和C# 6,解决bug的同时,代码优化更佳. Unity 5可以使用社区开源方案:https://bitbucket.org/ale ...
- java设定一个日期时间,加几分钟(小时或者天)后得到新的日期
//返回的是字符串型的时间,输入的 //是String day, int x public static String addDateMinut(String day, int x){ SimpleD ...
- 一个注意事项:内部类引用的外部变量必须是final的
之前写过一个项目,好久没更新了,最近翻起以前的代码,发现在这里报了一个错.(现在转到Intellij了,从前在Eclipse luna中是可以编译通过的,Eclipse mars也会报错,JDK版本都 ...
- 使用3D Slicer进行颅骨去除
关于3D Slicer的下载.安装及模块安装在上一篇博客中以及介绍过,以下将专注于使用3D Slicer进行颅骨去除 准备 此次,我们需要安装SwissSkullStripper模块,安装后需要重启软 ...
- Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer
输出复杂结构 Data::Dumper.Data::Dump.Data::Printer都可以用来输出复杂的数据结构.本文只介绍简单的几个输出形式,以后再需要的地方再详细介绍. 前两者建议传递数据结构 ...
- μC/OS-II 信号量集
简介 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构--信号量集. 信号量集所能 ...