SurfaceView使用介绍

  SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作。

  要使用SurfaceView进行绘制,步骤如下:

  1.用SurfaceView进行绘制,首先要创建一个类,继承 SurfaceView,同时这个类应该实现SurfaceHolder.Callback接口。

  这个接口中的三个回调函数(surfaceChanged(SurfaceHolder holder, int format, int width, int height),surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder))分别对应Surface何时更改、创建和销毁。

  2.对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用 getHolder()来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。

  3.在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。

  4.绘制:在线程类的run()方法中进行绘制操作,通过lockCanvas()方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。

  注意:每次利用SurfaceHolder获得画布时,前一次的内容将会保留。

代码示例

  1. package com.example.hellosurfaceview;
  2.  
  3. import android.content.Context;
  4. import android.content.res.Resources;
  5. import android.graphics.Bitmap;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.graphics.Rect;
  10. import android.util.AttributeSet;
  11. import android.util.Log;
  12. import android.view.SurfaceHolder;
  13. import android.view.SurfaceView;
  14.  
  15. public class MySurfaceView extends SurfaceView implements
  16. SurfaceHolder.Callback
  17. {
  18.  
  19. private DrawThread mThread = null;
  20.  
  21. public MySurfaceView(Context context, AttributeSet attrs, int defStyle)
  22. {
  23. super(context, attrs, defStyle);
  24. init();
  25. }
  26.  
  27. public MySurfaceView(Context context, AttributeSet attrs)
  28. {
  29. super(context, attrs);
  30. init();
  31. }
  32.  
  33. public MySurfaceView(Context context)
  34. {
  35. super(context);
  36. init();
  37. }
  38.  
  39. private void init()
  40. {
  41. Log.d(AppConstants.LOG_TAG, "init");
  42.  
  43. SurfaceHolder holder = getHolder();
  44. holder.addCallback(this);
  45.  
  46. mThread = new DrawThread(holder);
  47.  
  48. }
  49.  
  50. @Override
  51. protected void onSizeChanged(int w, int h, int oldw, int oldh)
  52. {
  53. Log.d(AppConstants.LOG_TAG, "onSizeChanged");
  54. super.onSizeChanged(w, h, oldw, oldh);
  55.  
  56. }
  57.  
  58. @Override
  59. public void surfaceCreated(SurfaceHolder holder)
  60. {
  61. Log.d(AppConstants.LOG_TAG, "surfaceCreated");
  62. mThread.setRun(true);
  63. mThread.start();
  64.  
  65. }
  66.  
  67. @Override
  68. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  69. int height)
  70. {
  71. Log.d(AppConstants.LOG_TAG, "surfaceChanged");
  72. }
  73.  
  74. @Override
  75. public void surfaceDestroyed(SurfaceHolder holder)
  76. {
  77. Log.d(AppConstants.LOG_TAG, "surfaceDestroyed");
  78. mThread.setRun(false);
  79.  
  80. }
  81.  
  82. /**
  83. * 绘制线程类
  84. *
  85. */
  86. public class DrawThread extends Thread
  87. {
  88. private SurfaceHolder mHolder = null;
  89. private boolean isRun = false;
  90.  
  91. public DrawThread(SurfaceHolder holder)
  92. {
  93. Log.d(AppConstants.LOG_TAG, "DrawThread Constructor");
  94. mHolder = holder;
  95.  
  96. }
  97.  
  98. public void setRun(boolean isRun)
  99. {
  100. Log.d(AppConstants.LOG_TAG, "DrawThread setRun: " + isRun);
  101. this.isRun = isRun;
  102. }
  103.  
  104. @Override
  105. public void run()
  106. {
  107. Log.d(AppConstants.LOG_TAG, "DrawThread run");
  108. int count = 0;
  109.  
  110. while (isRun)
  111. {
  112. Canvas canvas = null;
  113. synchronized (mHolder)
  114. {
  115. try
  116. {
  117. Log.d(AppConstants.LOG_TAG, "Drawing-------------");
  118. canvas = mHolder.lockCanvas();
  119. canvas.drawColor(Color.WHITE);
  120. Paint p = new Paint();
  121. p.setColor(Color.BLACK);
  122.  
  123. Rect r = new Rect(100, 50, 300, 250);
  124. canvas.drawRect(r, p);
  125. canvas.drawText("这是第" + (count++) + "秒", 100, 310, p);
  126.  
  127. Thread.sleep(1000);// 睡眠时间为1秒
  128.  
  129. }
  130. catch (Exception e)
  131. {
  132. Log.d(AppConstants.LOG_TAG, "throw Exception in run");
  133. e.printStackTrace();
  134.  
  135. }
  136. finally
  137. {
  138. if (null != canvas)
  139. {
  140. mHolder.unlockCanvasAndPost(canvas);
  141. }
  142. }
  143.  
  144. }
  145.  
  146. }
  147. }
  148.  
  149. }
  150.  
  151. }

参考资料

  官方文档:

  API Guides:Canvas and Drawables

  http://developer.android.com/guide/topics/graphics/2d-graphics.html

  SurfaceView:

  http://developer.android.com/reference/android/view/SurfaceView.html

  SurfaceHolder:

  http://developer.android.com/reference/android/view/SurfaceHolder.html

  博客:

  Android之SurfaceView学习(一):

  http://www.cnblogs.com/xuling/archive/2011/06/06/android.html

  剖析 SurfaceView:

  http://blog.csdn.net/xiaominghimi/article/details/6090575

Android 利用SurfaceView进行图形绘制的更多相关文章

  1. Android: 利用SurfaceView绘制股票滑动直线解决延迟问题

    1.背景介绍 最近项目要绘制股票走势图,并绘制能够跟随手指滑动的指示线(Indicator)来精确查看股票价格和日期.如下图所示: 上图中的那条白色直线就是股票的指示线,用来跟随手指精确确定股票的时间 ...

  2. Android UI SurfaceView的使用-绘制组合图型,并使其移动

    绘制容器类: //图形绘制容器 public class Contanier { private List<Contanier> list; private float x=0,y=0; ...

  3. Android UI SurfaceView的使用-绘制单个图型或多个图形

    新建MyView类继承自SurfaceView: public class MyView extends SurfaceView implements SurfaceHolder.Callback { ...

  4. Android自定义控件之基本图形绘制

    入门示例代码 在Android中Paint类就是画笔,Canvas 就是画布 对于画笔的大小,粗细,颜色,透明度都在paint类中设置,对于画出的成品,比如圆,方形,等在canvas类中的函数生成 入 ...

  5. Android利用canvas画各种图形

    Android利用canvas画各种图形(点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形) 本文链接:https://blog.csdn.net/rhljiayou/article/det ...

  6. Android 利用属ObjectAnimator,AnimatorSet性动画绘制一个弹球,加速下落,到底部时挤压,然后减速上弹

    属性动画主要的几个类介绍: 1.ValueAnimator:这个类提供了一个简单的计时引擎运行动画动画计算值和设置目标对象.注意:使用该类时一般都是用:ObjectAnimator,而基于Object ...

  7. Android 4.0的图形硬件加速及绘制技巧

    转:http://zuiniuwang.blog.51cto.com/3709988/721798 从Android 3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速.使用GP ...

  8. Android OpenGL ES 开发:绘制图形

    OpenGL 绘制图形步骤 上一篇介绍了 OpenGL 的相关概念,今天来实际操作,使用 OpenGL 绘制出图形,对其过程有一个初步的了解. OpenGL 绘制图形主要概括成以下几个步骤: 创建程序 ...

  9. 图形绘制 Canvas Paint Path 详解

    图形绘制简介        Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...

随机推荐

  1. 【翻译】How To Tango With Django 1.5.4 第五章

    5数据模型和数据库 一个模型就是一个描述你数据表的python对象.不用再通过SQL来操作数据库,而是使用python对象来操作数据库. 5.1rango要求 ...一个目录下面有多个下面 ...一个 ...

  2. ArrayBlockingQueue,BlockingQueue分析

    BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会 ...

  3. 捕获Insert触发器失败记录

    1.背景 环境:发布服务器A Windows2008+SQL2008,分发服务器B Windows2008+SQL2008,订阅服务器C Windows2008+SQL2012发布服务器A上的用户信息 ...

  4. ios-高仿别踩白块游戏的实现

    先看下效果图片 前几天看到一个游戏叫别踩白块,下载量还挺大几百万了都,下载下来玩了玩看了看,这个游戏还挺简单的.俗话说想一千遍,一万遍不如动手做一遍来的实在.昨晚以及今天白天闲的没事就开搞了,下午六点 ...

  5. dubbo源码分析1-reference bean创建

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  6. jQuery与其他JS库冲突解决

    实际开发中遇到JQuery与其他js库起冲突 究其原因,是它们的全局对象定义冲突了,特别是变量”$”, 可重载$函数.使用jQuery.noConflict()就可以通过重载$函数 例:项目中应用的 ...

  7. 夺命雷公狗-----React---7--组建的状态props和state

    props:组建初始要渲染的数据,他是不可以改变的 state:组建状态发生改变,调用render重新渲染数据 我们来写一个例子: <!DOCTYPE html> <html lan ...

  8. Struts2 配置详解

    1. web.xml 此文件的配置可以参看struts2的示例文档 <filter> <filter-name>struts2</filter-name> < ...

  9. 设置irb和ri

    设置irb和ri 输入ruby -v查看是否能够显示ruby版本 现在可以 配置irb了. irb是交互式Ruby 的命令行工具,即输入一句就立即执行并给出结果. 默认的irb不够强大,现在给它配置一 ...

  10. Boadload和Image$$??$$Limit含义

    Bootloader 即引导加载程序,是系统加电后运行的第一段软件代码.简单的说它们都是bootloader,所完成的任务也大同小异. 熟悉x86体系结构的朋友肯定知道,x86平台上bootloade ...