SurfaceView与普通View还有一个重要区别:View的绘图必须在UI线程中进行,但SurfaceView不存在这个问题,因为它是由SurfaceHolder来完成的。所以对于View组件,如果绘图时间过长,会阻塞UI主线程,而SurfaceHolder则会启动新的线程去更新SurfaceView的绘制,不会阻塞UI线程。

下面的程序是通过SurfaceView绘制正玄曲线和余玄曲线的示例,代码如下:

Activity:

package com.home.showwave;

import java.util.Timer;
import java.util.TimerTask; import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View; public class ShowWaveActivity extends Activity {
private SurfaceHolder holder;
private SurfaceView surface;
private Paint paint;
private final int HEIGHT = 320;
// 要绘制的曲线的水平宽度
private final int WIDTH = 500;
// 离屏幕左边界的起始距离
private final int X_OFFSET = 5;
// 初始化X坐标
private int cx = X_OFFSET;
// 实际的Y轴的位置
private int centerY = HEIGHT / 2;
private Timer timer = new Timer();
private TimerTask task = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_wave);
// 获得SurfaceView对象
surface = (SurfaceView) findViewById(R.id.activity_show_wave_sv);
// 初始化SurfaceHolder对象
holder = surface.getHolder();
paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(3); } public void click(final View v) {
drawBackGround(holder);
cx = X_OFFSET;
if (task != null) {
task.cancel();
}
task = new TimerTask() { @Override
public void run() {
// 根据是正玄还是余玄和X坐标确定Y坐标
int cy = v.getId() == R.id.activity_show_wave_btn_sin ? centerY
- (int) (100 * Math.sin((cx - 5) * 2 * Math.PI / 150))
: centerY
- (int) (100 * Math.cos((cx - 5) * 2 * Math.PI
/ 150));
Canvas canvas = holder.lockCanvas(new Rect(cx, cy - 2, cx + 2,
cy + 2));
// 根据X,Y坐标画点
canvas.drawPoint(cx, cy, paint);
cx++;
// 超过指定宽度,线程取消,停止画曲线
if (cx > WIDTH) {
task.cancel();
task = null;
}
// 提交修改
holder.unlockCanvasAndPost(canvas);
}
};
timer.schedule(task, 0, 30);
holder.addCallback(new Callback() { @Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
drawBackGround(holder);
} @Override
public void surfaceCreated(SurfaceHolder holder) { } @Override
public void surfaceDestroyed(SurfaceHolder holder) {
timer.cancel();
}
});
} private void drawBackGround(SurfaceHolder holder) {
Canvas canvas = holder.lockCanvas();
// 绘制白色背景
canvas.drawColor(Color.WHITE);
Paint p = new Paint();
p.setColor(Color.BLACK);
p.setStrokeWidth(2);
// 绘制坐标轴
canvas.drawLine(X_OFFSET, centerY, WIDTH, centerY, p);
canvas.drawLine(X_OFFSET, 40, X_OFFSET, HEIGHT, p);
holder.unlockCanvasAndPost(canvas);
holder.lockCanvas(new Rect(0, 0, 0, 0));
holder.unlockCanvasAndPost(canvas);
}
}

布局XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" > <Button
android:id="@+id/activity_show_wave_btn_sin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="正玄曲线" /> <Button
android:id="@+id/activity_show_wave_btn_cos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="余玄曲线" />
</LinearLayout> <SurfaceView
android:id="@+id/activity_show_wave_sv"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>

SurfaceView的一个小应用:开发示波器的更多相关文章

  1. 13、Cocos2dx 3.0三,找一个小游戏开发3.0中间Director :郝梦主,一统江湖

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706967 游戏中的基本元素 在曾经文章中,我们具 ...

  2. 14、Cocos2dx 3.0三,找一个小游戏开发Scene and Layer:游戏梦想

    发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director ...

  3. 微信小程序开发2-第一个小程序开发准备

    1.首先在官网上注册一个账号( https://mp.weixin.qq.com/ )申请一个AppID(类似于人的身份证,小程序也需要身份证) 注册过程不多说 2.安装开发工具( https://m ...

  4. 8、Cocos2dx 3.0三,找一个小游戏开发3.0存储器管理的版本号

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十 ...

  5. 4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 Hello World 分析 打开新 ...

  6. 微信小程序开发平台新功能「云开发」快速上手体验

    微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...

  7. 微信小程序开发(四)线程架构和开发步骤

    线程架构 从前面的章节我们可以知道,.js文件是页面逻辑处理层.我们可以按需在app.js和page.js中添加程序在生命周期的每个阶段相应的事件.如在页面的onLoad时进行数据的下载,onShow ...

  8. 微信小程序开发教程(四)线程架构与开发步骤

    线程架构 从前面的章节我们可以知道,.js文件是页面逻辑处理层.我们可以按需在app.js和page.js中添加程序在生命周期的每个阶段相应的事件.如在页面的onLoad时进行数据的下载,onShow ...

  9. 微信小程序开发注意事项(优化项)

    最近公司有一个小程序开发项目,自己也自学了不少,有一些开发小心得,记录在这里. 小程序开发中注意: 1,setData 小程序视图层和逻辑层在两个独立的模块,并不具备数据直接传递的,setData相当 ...

随机推荐

  1. JavaScript进阶(三) 值传递和引用传递

    从C语言开始 有时候讲一些细节或是底层的东西,我喜欢用C语言来讲,因为用C更方便来描述内存里面的东西.先举一个例子,swap函数,相信有一些编程经验的人都见识过,声明如下,函数体我就不写了,各位脑补一 ...

  2. ARC内存使用注意事项

    官方介绍: https://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/M ...

  3. <转载>CSS解决图片过大撑破DIV的方法

    DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ...

  4. 出现Data Tools 与VS 不兼容问题

    转载自:http://www.yishimei.cn/network/73.html 相信很多人都遇到了“此版本的SQL Server Data Tools与此计算机中安装的数据库运行时组件不兼容”这 ...

  5. Entity - 使用EF框架进行增删改查 - 数据库先行

    数据库先行:先创建数据库,然后进行增删查该操作. 要操作的表结构(表名:Tb_Category): 创建一个控制台程序: 添加一个ADO.NET实体数据模型: 1.对控制台程序右键 2.选择ADO.N ...

  6. 解决Java compiler level does not match the version of the installed Java project facet.问题

    其实之前遇到过Java compiler level does not match the version of the installed Java project facet.这个问题,因为当时没 ...

  7. 3篇OAuth的文章

    http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html http://blog.unvs.cn/archives/oauth-qq1.0-devel ...

  8. 记一个手游app数据文件的破解

    出于一些非常猥琐的须要,同一时候自己也想做一些新奇的尝试,周末用了大半天时间破解了某款手游的数据文件. 过程比我预想的要顺利,主要原因还是我们开发者的懈怠.咳咳. 步骤例如以下: 下载安装包,解压,发 ...

  9. 自定义ALV控件的工具条按钮

    *&---------------------------------------------------------------------* *& Report YTEST028 ...

  10. [置顶] Embedded Server:像写main函数一样写Web Server

    1.传统的JEE Web Server 传统的JEE中,如果我们想要部署一个Web Application,我们需要首先安装一个Container Server,如JBoss,WebLogic,Tom ...