1、在绘制正弦曲线之前,先简单讲解一下SurfaceView的基本用法:

我们在使用SurfaceView的时候,主要用到三个类,SurfaceView, SurfaceHolder, SurfaceHolder.Callback。SurfaceView是视图控件,其包含了一块叫做Surface的内存区域,我们通过SurfaceHolder提供的API方法操作这块内存区域实现绘图,SurfaceHolder.Callback是在Surface创建,销毁,状态改变时回调。

2、下面讲解绘制正弦曲线,通过绘制正弦曲线,讲解SurfaceView的用法

1)、在XML布局文件中引用SurfaceView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"><SurfaceView
        android:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/action_container" /><LinearLayout
        android:id="@+id/action_container"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_alignParentBottom="true" ><Button
            android:id="@+id/btnPlay"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Play" /></LinearLayout></RelativeLayout>

ps:SurfaceView的使用和其他空间并无特殊之处,直接在XML中引用便可

public class MainActivity extends Activity implements SurfaceHolder.Callback{public static final String TAG = "camera";//x方向的单位长度,即20像素代表一个单位长度private static final double UNIT_X = 20;//y方向的单位长度,即20像素代表一个单位长度private static final double UNIT_Y = 50;private int centerX, centerY;private SurfaceView surfaceView;//该类提供了操作SurfaceView的APIprivate SurfaceHolder holder;//计时器,用于绘制正弦曲线。SurfaceView与普通View的区别就是SurfaceView可以在子线程中更新UI,这样在UI更新频繁的场景下(比如游戏中精灵的移动)可以避免阻塞主线程private Timer timer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);//通过SurfaceView.getHolder()方法获得SurfaceHolderholder = surfaceView.getHolder();//设置SurfaceView的回调holder.addCallback(this);paint = new Paint();paint.setColor(Color.WHITE);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}//数学坐标到像素点的转换private int coordinate2Pix(double coordinate, double unit){return (int)(coordinate * unit);}//像素点到数学坐标的转换private double pix2Coordinate(int pix, double unit){return pix / unit;}private Paint paint;class MyTimerTask extends TimerTask{private int px, py;public MyTimerTask(){}@Overridepublic void run() {/***基本绘制思路是,从x方向像素为0的点算起,计算出像素点的数学坐*标,通过正弦函数sin(x)计算出y的数学坐标,再将数学坐标转换*成像素点,绘制计算出来的像素点,然后x++,重复上述过程。。。**/double cx = pix2Coordinate(px, UNIT_X);double cy = Math.sin(cx);py = coordinate2Pix(cy, UNIT_Y) + surfaceView.getHeight() / 2;Rect dirty = new Rect(px - 1, py - 1, px + 1, py+1);Canvas canvas = holder.lockCanvas(dirty);canvas.drawLine(0, centerY, surfaceView.getWidth(), centerY, paint);canvas.drawCircle(px, py, 2, paint);holder.unlockCanvasAndPost(canvas);px++;}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {//Surface创建成功之后回调Log.i(TAG, "surfaceCreated");if(timer == null){timer = new Timer();}centerX = 0;centerY = surfaceView.getHeight() / 2;timer.schedule(new MyTimerTask(), 0, 100);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {Log.i(TAG, "surfaceChanged");}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {//SurfaceView销毁后回调Log.i(TAG, "surfaceDestroyed");if(timer != null){timer.cancel();timer = null;}}
}

用SurfaceView绘制正弦曲线相关推荐

  1. Android 音视频开发之基础篇 使用 SurfaceView绘制一张图片

    Android 音视频开发 上一篇文章:使用 imageview绘制一张图片 任务一 SurfaceView绘制一张图片 文章目录 Android 音视频开发 前言 一.surfaceview是什么? ...

  2. PyQt5最全26 绘图之drawPoint用像素点绘制正弦曲线

    PyQt5最全26 绘图之drawPoint用像素点绘制正弦曲线 import sys import math from PyQt5.QtWidgets import QApplication, QW ...

  3. android:怎样用一天时间,写出“飞机大战”这种游戏!(无框架-SurfaceView绘制)...

    序言 作为一个android开发人员,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的. 体验地址:http://www.wandoujia ...

  4. android画布一闪一闪的,解决Android SurfaceView绘制触摸轨迹闪烁问题的方法

    本文分享了解决SurfaceView触摸轨迹闪烁问题的方法,供大家参考,具体内容如下 第一种解决SurfaceView触摸轨迹闪烁问题的方法: 由于SurfaceView使用双缓存机制,两张画布轮流显 ...

  5. Android开发之自定义SurfaceView绘制动效音波图 | 动效音阶图 | Android自定义View

    老套路献上图: 第一张是通过播放歌曲拿到歌曲播放的数据进行动态展示的 第二张是通过定时器随机生成的数据动态展示的 先说下这个自定义view也不难很简单,就是绘制矩形,唯一的难点在于计算矩形的坐标 说下 ...

  6. 绘制正弦函数的c语言程序,C语言控制台应用程序GDI绘制正弦曲线.pdf

    C语语言言控控制制台台应应用用程程序序GDI绘绘制制正正弦弦曲曲线线 出于本科教学的目的,需要使用C语言在V isual Studio下控制台应用程序中动态绘制曲线,在 查阅了一些资料,制作了一个绘 ...

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

    众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ...

  8. numpy+matplotlib绘制正弦曲线

    代码源于:Python数据分析与挖掘实战 #-coding: utf-8 -*-import numpy as np import matplotlib.pyplot as pltx = np.lin ...

  9. 用html语言绘制正弦曲线,使用js画图之正弦曲线

    数学式:y=Asin(ωx+φ)+k JS函数的声明: //画正弦曲线 //dot 原点 //amplitude    振幅 -- A //initialPhase 初相 -- φ //setover ...

最新文章

  1. python 字符串内容
  2. Linux系统中运行.sh文件的几种方法
  3. JAVA/PHP/C#版RSA验签--转
  4. 如何设计一门语言(三)——什么是坑(面向对象和异常处理)
  5. 记Thoughtworks一次糟糕的面试
  6. laravel 分词搜索匹配度_DSSM文本匹配模型在苏宁商品语义召回上的应用
  7. Ubuntu防火墙:ufw
  8. uestc 方老师的分身 II
  9. 39岁阿里P9失业了,总资产1.5亿……
  10. C#中IPAddress与域名的使用
  11. CISCO路由器如何删除配置及%%non-valatile configuration memory is not present无法保存配置...
  12. 现代通信技术之软交换技术和IMS技术
  13. CRC循环冗余校验码的C语言实现
  14. windows下cmd 查找/关闭端口
  15. 移动硬盘计算机限制打不开,可移动磁盘打不开,教您移动硬盘打不开怎么办
  16. 以春雨为题写一篇500字的散文
  17. 给陈景润之子陈由伟的一封公开信
  18. 北斗导航 | 基于性能导航(PBN)涉及术语
  19. 窗口取消置顶后被父窗口挡住,HWND_TOPMOST与HWND_NOTOPMOST踩坑记录
  20. 电脑用java怎么编程,使用java编程从0到1实现一个简单计算器

热门文章

  1. 软件项目管理案例教程-韩万江-期末复习
  2. 思维导图分享以及MindManager使用说明
  3. MindManager:将excel转成思维导图
  4. HDU 4607 Park Visit 两次DFS求树直径
  5. 一行代码去除序列中含有n或者其他简并碱基的低质量序列
  6. Word 2010 中的 VBA 入门
  7. apktool安装过程
  8. Final Cut Pro 学习笔记
  9. 让机器“一叶知秋”:弱监督视觉语义分割
  10. 《Windows 8 权威指南》——第1章 Windows 8已经到来的盛宴 1.1 Windows商店