文档章节

Android之SurfaceView使用总结

zhangyujsj
 zhangyujsj
发布于 2016/01/04 22:46
字数 416
阅读 170
收藏 5

1.概念

      SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的 线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背 景、人物、动画等等尽量在画布canvas中画出。

2.实现方法

1)实现步骤

    a.继承SurfaceView

    b.实现SurfaceHolder.Callback接口

2)需要重写的方法

复制代码

(1)  surfaceChanged(SurfaceHolder holder, format, width, height){}  

(2)  surfaceCreated(SurfaceHolder holder){}  

(3)  surfaceDestroyed(SurfaceHolder holder) {}  

复制代码

3)SurfaceHolder

  SurfaceHolder,surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:

复制代码

(1)、  addCallback(SurfaceHolder.Callback callback);
(2)、 Canvas lockCanvas();
(3)、 Canvas lockCanvas(Rect dirty);
(4)、  unlockCanvasAndPost(Canvas canvas);

复制代码

4)总结整个过程

  继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。

下面是一个完整的案例:

复制代码

public class ViewTest extends Activity {
    @Override
        onCreate(Bundle savedInstanceState) {
         .onCreate(savedInstanceState);
         setContentView( MyView());
      }
            MyView  SurfaceView  SurfaceHolder.Callback
      {
          SurfaceHolder holder;
          MyThread myThread; 
          MyView(Context context) {
             (context);
                          holder = .getHolder();
             holder.addCallback();
             myThread =  MyThread(holder);         }
  
         @Override
           surfaceChanged(SurfaceHolder holder,  format,  width,
                   height) {
                            
         }
  
         @Override
           surfaceCreated(SurfaceHolder holder) {
                           myThread.isRun = ;
             myThread.start();
        }
  
        @Override
           surfaceDestroyed(SurfaceHolder holder) {
                        myThread.isRun = ;
        }
      }
             MyThread  Thread
      {
           SurfaceHolder holder;
            isRun ;
            MyThread(SurfaceHolder holder)
          {
              .holder =holder; 
              isRun = ;
          }
          @Override
            run()
          {
               count = 0;
              (isRun)
              {
                  Canvas c = ;
                  
                  {
                       (holder){
                        c = holder.lockCanvas();                    c.drawColor(Color.BLACK);                    Paint p =  Paint();                     p.setColor(Color.WHITE);
                    Rect r =  Rect(100, 50, 300, 250);
                    c.drawRect(r, p);
                    c.drawText("这是第"+(count++)+"秒", 100, 310, p);
                    Thread.sleep(1000);                  }
              }
               (Exception e) {
                  e.printStackTrace();
              }
              
              {
                   (c!= )
                 {
                   holder.unlockCanvasAndPost(c);                }
           }
         }
       }
     }
  }

复制代码


本文转载自:http://www.cnblogs.com/devinzhang/archive/2012/02/03/2337559.html

zhangyujsj
粉丝 25
博文 358
码字总数 224241
作品 0
广州
私信 提问
Android:SurfaceView 的使用(附代码模板)

前言 摘自《Android群英传》 Android提供了View进行绘图处理,View可以满足大部分的绘图需求,但在某些时候也会心有余而力不足。我们知道,View通过刷新来重绘视图,Android 系统通过发出VSY...

涤生_Woo
2017/05/23
0
0
Android多人视频聊天应用的开发(三)多人聊天

在上一篇《Android多人视频聊天应用的开发(二)一对一聊天》中我们学习了如何使用声网Agora SDK进行一对一的聊天,本篇主要讨论如何使用Agora SDK进行多人聊天。主要需要实现以下功能: 1、...

东风玖哥
2018/04/17
0
0
【Android游戏开发二十六】追加简述SurfaceView 与 GLSurfaceView效率!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/388.html 今天在这里大概说下现在为什么游戏引擎都趋向与openGL进行的...

迷途d书童
2012/03/19
247
0
android中使用surfaceview+MediaPlayer播放视频

Android中播放视频主要有两种方式: 使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型 使用android自带的VideoView,这种方法太简单就不介绍了 使用SurfaceView+Med...

天王盖地虎626
2018/12/24
23
0
利用ZXING扫描二维码的分析

之前给公司做了一个摄影相关的应用,现在要添加二维码扫描的功能,网上找资料后,虽然已经成功集成到app里面,但是总感觉心里没底儿。所以趁这段时间不是很忙,总结一下。 首先是启动扫描的U...

lifer
2014/05/08
449
0

没有更多内容

加载失败,请刷新页面

加载更多

IDEA 拉取、上传、更新 项目到 Gitee+GitHub_超详细超简单版

注:本人使用的idea是最新版(2019.1.2),要是其他的版本的不要惊慌〜,基本上都一样,没有什么太大的差别的 首先我要说一下,拉取项目分两个,一个,你就没有项目,拉取仓库的整个项目,而...

杨木发
今天
54
0
pyqt5环境搭建(Ubuntu19.10+pycharm+python3)

1.安装pyqt5 sudo apt-get install python3-pyqt5 sudo apt-get install qttools5-dev-tools sudo apt-get install qt5-default 2.安装pycharm 下载pycharm社区版安装包并解压 在桌面新建pyc......

小芯片
今天
54
0
Vue造轮子-tab组件(中)

1. 如果给一个标签一个class,标签本身又有class,vue是默认会合并的。只有两个属性是这样一个是class,一个是style。这样就比较好改样式。 <g-tabs-head class="red"></g-tabs> 2. 组件的...

ories
昨天
59
0
Windows 版本 Anaconda 配置加速源安装软件

C:\Users\lenovo\.condarc 首先安装Anaconda最新版本。 其次添加安装目录到环境变量。文本为 C:\ProgramData\Anaconda3\Library\bin 运行 conda 命令在 Windows 用户下生成文件 .conda...

白豆腐徐长卿
昨天
232
0
如何从Bash函数返回字符串值

我想从Bash函数返回一个字符串。 我将用Java编写示例以显示我想做的事情: public String getSomeString() { return "tadaa";}String variable = getSomeString(); 下面的示例在bash中...

javail
昨天
71
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部