surface知识点
SurfaceView和TextureView
在学习直播的过程遇到一个问题:连麦场景下能够支持大小窗口切换(即小窗口变大,大窗口变小),大窗口是TextView(用于拉流显示),而小窗口是SurfaceView(用于推流时的本地预览),切换的思路是直接改变View大小,在将TextView变小后还能正常显示,但是将SurfaceView的变大后直接黑屏。所以需要研究一下SurfaceView和TextureView的区别。
帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的
SurfaceFlinger服务运行在Android系统的System进程中,它负责管理Android系统的帧缓冲区
Surface类
andorid是给出的解释是“Handle onto a raw buffer that is being managed by the screen compositor”,意思是surface是raw buffer的句柄,而且这个buffer是由screen compostior来管理的。raw buffer存储着当前窗口的像素数据,而screen compositor(屏幕合成器)目前不知道是什么鬼。既然Surface是raw buffer的句柄,那么我们就可以通过Surface对buffer进行操作(就像通过文件句柄读写文件一样),而buffer中存储着要显示的像素数据,那么最终我们可以通过Surface来控制屏幕上显示什么内容。
那么Surface怎么使用呢?下面是Surcafe中的两个方法
//Gets a Canvas for drawing into this surface.
Canvas	lockCanvas(Rect inOutDirty)
//Posts the new contents of the Canvas to the surface and releases the Canvas.
unlockCanvasAndPost(Canvas canvas)
第一个方法用来得到Canvas,然后我们在Canvas上画画(如果写过自定义View,那你对Canvas一定不会陌生),第二个方法就是将我们画好的画写到Surface中,对Surface的操作就这么简单。
通常情况下,我们不会去创建一个Surface对象(Surface功能太少),而是通过创建SurfaceTexture或MediaRecorder这样的对象来创建Surface,这两个类内部会自动创建Surface对象,例如SurfaceTexture类的部分代码:
public class SurfaceView extends View {
    .......
    final ArrayList<SurfaceHolder.Callback> mCallbacks
            = new ArrayList<SurfaceHolder.Callback>();
    final int[] mLocation = new int[2];
    final ReentrantLock mSurfaceLock = new ReentrantLock();
    final Surface mSurface = new Surface();       // Current surface in use
    final Surface mNewSurface = new Surface();    // New surface we are switching to
	.......
}
而且我们也不会直接控制Sufrace,而是通过创建特定功能类(例如OpenGL, MediaPlayer, 或者CameraDevice)来向Surface中写数据。像MediaPlayer(音视频播放器)的使用,
mediaPlayer.setDisPlay(surfaceView.getHolder());
这里不会把surfaceView直接传进去,而是将其内部类SurfaceHolder传进去,可能是对surfaceView的保护吧
SurfaceView
上面已经介绍一部分SurfaceView,我们可以看出它她继承于View,而且它内置了一个surface。所以SurfaceView具有和其他的View(比如TextView)一样的特性,它会参与视图结构(View Hierarchy, View树)的绘制。但是它也有不同的地方,普通的View的都绘制在同一个绘图表面(Acitivity的Surface)上, 但是SurfaceView拥有自己的绘图表面,这样做的好处就是我们可以在子线程中更新SurfaceView中的内容。但是这样带来了一个问题,那就是不能对SurfaceView进行平移,缩放的操作。要更改一个控件的位置,大小,这个控件必须在主窗口(也就是Activity对应的窗口),但是SurfaceView用户自己的绘图表面,拥有自己的Window,我们更改SurfaceView将起不到任何作用。
SurfaceView的简单使用
class GameUI extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder holder;
    private RenderThread renderThread;
    private boolean isDraw = false;// 控制绘制的开关
    public GameUI(Context context) {
        super(context);
        holder = this.getHolder();
        holder.addCallback(this);
        renderThread = new RenderThread();
    }
    /**
     *
     * @param holder
     * @param format
     * @param width
     * @param height
     */
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        isDraw = true;
        renderThread.start();
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        isDraw = false;
    }
    /**
     * 绘制界面的线程
     *
     * @author Administrator
     *
     */
    private class RenderThread extends Thread {
        @Override
        public void run() {
            // 不停绘制界面
            while (isDraw) {
                drawUI();
            }
            super.run();
        }
    }
    /**
     * 界面绘制
     */
    public void drawUI() {
        Canvas canvas = holder.lockCanvas();
        try {
            drawCanvas(canvas);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            holder.unlockCanvasAndPost(canvas);
        }
    }
    private void drawCanvas(Canvas canvas) {
        // 在 canvas 上绘制需要的图形
    }
}
TextureView
TextureView就是普通的
参考
SurfaceView
http://www.cnblogs.com/wytiger/p/5693569.html
http://blog.csdn.net/luoshengyang/article/details/8661317
http://www.cnblogs.com/nicolaswang/p/3723089.html
TextureView
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1213/2153.html
http://blog.csdn.net/yanzi1225627/article/details/33313707
surface知识点的更多相关文章
- Android系统Surface机制的SurfaceFlinger服务的启动过程分析
		文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8022957 在前面一篇文章中,我们简要介绍了A ... 
- Android 程序员必须知道的 53 个知识点
		1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ... 
- [深入理解Android卷一全文-第八章]深入理解Surface系统
		由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ... 
- CRM客户关系管理系统知识点总结
		一.项目需求(使用PrecessOn) 二.models.py from django.db import models from django.contrib.auth.models import ... 
- Unity3D重要知识点(转)
		Unity3D重要知识点 数据结构和算法很重要!图形学也很重要!大的游戏公司很看重个人基础,综合能力小公司看你实际工作能力,看你的Demo. 1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的 ... 
- ASP.NET Core 中的那些认证中间件及一些重要知识点
		前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ... 
- ASP.NET MVC开发:Web项目开发必备知识点
		最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ... 
- UWP开发必备以及常用知识点总结
		一直在学UWP,一直在写Code,自己到达了什么水平?还有多少东西需要学习才能独挡一面?我想对刚接触UWP的开发者都有这种困惑,偶尔停下来总结分析一下还是很有收获的! 以下内容是自己开发中经常遇到的一 ... 
- C#高级知识点&(ABP框架理论学习高级篇)——白金版
		前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ... 
随机推荐
- Tomcat服务器的搭建
			一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ... 
- php学习五:数组操作
			前言:由于之前接触过js,所以在学习php的时候,里面继承了js的许多方法,所以数组里面的许多操作和js很相似,但是却比js里面多的多,个人感觉php是集成数组方法最多的一个 ,今天学习的有二十余个, ... 
- 【linux】安装rar,并解压被压缩成多个rar的文件
			rar 官网:http://www.rarsoft.com/download.htm 选择 RAR for linux (注意你的系统是32位还是64位) 1 安装命令: $ cd /roo ... 
- Docker源码分析(六):Docker Daemon网络
			1. 前言 Docker作为一个开源的轻量级虚拟化容器引擎技术,已然给云计算领域带来了新的发展模式.Docker借助容器技术彻底释放了轻量级虚拟化技术的威力,让容器的伸缩.应用的运行都变得前所未有的方 ... 
- 关于Visual Studio 20**自动添加头部注释信息
			作为一个万年潜水党,不管这一篇文章技术含量如何,也算是一个好的开始吧. 在日常的开发中我们经常需要为类库添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们 ... 
- ionic+cordova开发!
			这里是一些学习的过程中纪录的: 官方网站: http://www.ionic-china.com/ 参考文章: https://blog.csdn.net/xyzz609/article/detail ... 
- 微信小程序 --- 登录页面
			思路:在个人中心页面,首先判断全局的 app.js 里面的 globalData 里面的 is_login 状态,并且判断 缓存数据中的 is_login 状态,如果都为真,就正常显示,如果有一个为假 ... 
- T-SQL备份数据库恢复
			注:此操作在master数据库上执行 /*1.--得到数据库的文件目录 @dbname 指定要取得目录的数据库名 如果指定的数据不存在,返回安装SQL时设置的默认数据目录 如果指定NULL,则返回默认 ... 
- 更快写入的落脚点不是线程数而是mysql连接数  对数据库 批处理 批写入
			批提交mysql 单线程的批提交 nohup python fromRedisoToMysqlSingleThreadOneConnBatchInsert.py 100 10.24.192.192 ... 
- python面向对象(类的成员及类方法)
			类的普通成员 字段 方法 属性 类的高级成员 静态字段 静态方法 属性方法 类方法 类成员修饰符 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中, ... 
