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知识点的更多相关文章

  1. Android系统Surface机制的SurfaceFlinger服务的启动过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8022957 在前面一篇文章中,我们简要介绍了A ...

  2. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  3. [深入理解Android卷一全文-第八章]深入理解Surface系统

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...

  4. CRM客户关系管理系统知识点总结

    一.项目需求(使用PrecessOn) 二.models.py from django.db import models from django.contrib.auth.models import ...

  5. Unity3D重要知识点(转)

    Unity3D重要知识点 数据结构和算法很重要!图形学也很重要!大的游戏公司很看重个人基础,综合能力小公司看你实际工作能力,看你的Demo. 1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的 ...

  6. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  7. ASP.NET MVC开发:Web项目开发必备知识点

    最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...

  8. UWP开发必备以及常用知识点总结

    一直在学UWP,一直在写Code,自己到达了什么水平?还有多少东西需要学习才能独挡一面?我想对刚接触UWP的开发者都有这种困惑,偶尔停下来总结分析一下还是很有收获的! 以下内容是自己开发中经常遇到的一 ...

  9. C#高级知识点&(ABP框架理论学习高级篇)——白金版

    前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...

随机推荐

  1. 关于MCU的烧录,下载与其他接口的比较(一)

    今天呢,犯了一个很严重的错误,我不知道这会产生什么样的影响,但我知道,如果我以后再没有具体的了解,仔细认真地观察,认证,只会滑到无底的深渊.做技术来不得半点虚假,切记一知半解,凡事都要弄得清楚明白,认 ...

  2. CentOS 6.3下Samba服务器的安装与配置详解

    一.简介 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的 ...

  3. Nginx.conf 配置文件详细说明

    在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data;    #启动进程,通常设置成和cpu的数量相等worker_process ...

  4. UISearchBar和UISearchDisplayController

    原文 http://hi.baidu.com/happywilma0118/item/e6d5730a499bba1b3a53eef8 UISearchBar继承自UIView.UIResponder ...

  5. Android 基于帧布局实现一个进度条 FrameLayout+ProgressBar

    在FrameLayout中添加一个ProgressBar居中 <ProgressBar android:layout_gravity="center" android:id= ...

  6. [Web Chart系列之六] canvas Chart 导出图文件

    前言 博主正在参加CSDN2013年度博客之星评选,如果这篇文章对您有用,请投他一票: 投票地址:http://vote.blog.csdn.net/blogstaritem/blogstar2013 ...

  7. React基础---->ReactJS的使用(一)

    ReactJS的初次使用,比较简单的例子. React的使用 一.下载ReactJS,地址:http://reactjs.cn/react/downloads.html,直接解压就行. 二.在html ...

  8. 【Spring Boot && Spring Cloud系列】构建Springboot项目 实现restful风格接口

    项目代码如下: package hello; import org.springframework.boot.SpringApplication; import org.springframework ...

  9. JS-在线运行代码小工具

    原理:window.open()方法,open一个新的空白页,然后把文本框中粘贴的代码通过DOM操作,写到新的代码页中, 再利用document.write的功能(写进去之前把其他的全部删掉,并且写进 ...

  10. 【Android】ImageMap,图片地图

    https://github.com/CFutureTeam/android-image-map package com.*.imagemap; import *.imagemap.ImageMap; ...