SurfaceView

​ Activity的View hierachy的树形结构,最顶层的DecorView,也就是根结点视图,在SurfaceFlinger中有对应的Layer。

​ 对于具有SurfaceView的窗口来说,每一个SurfaceView在SurfaceFlinger服务中还对应有一个独立的Layer,用来单独描述它的绘图表面,以区别于它的宿主窗口的绘图表面。

​ 在WMS和SurfaceFlinger中,它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做。这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,一些View中的特性也无法使用。

surfaceView.png

优点:

​ 可以在一个独立的线程中进行绘制,不会影响主线程。

​ 使用双缓冲机制,播放视频时画面更流畅。

缺点:

​ Surface不在View hierachy中,显示也不受View的属性控制,所以不能进行平移,缩放等变换。

双缓冲:两张Canvas,一张frontCanvas和一张backCanvas,每次实际显示的是frontCanvas,backCanvas存储的是上一次更改前的视图,当使用lockCanvas()获取画布,得到的backCanvas而不是正在显示的frontCanvas,之后在获取到的backCanvas上绘制新视图,再unlockCanvasAndPost更新视图,上传的这张canvas将替换原来的frontCanvas作为新的frontCanvas,原来的frontCanvas将切换到后台作为backCanvas。

TextureView

​ 在4.0(API level 14)中引入。和SurfaceView不同,不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。TextureView必须在硬件加速的窗口中。

优点:

​ 支持移动、旋转、缩放等动画,支持截图

缺点:

​ 必须在硬件加速的窗口中使用,占用内存比SurfaceView高(因为开启了硬件加速),可能有1〜3帧延迟。

Surface与SurfaceTexture

​ 如果说Surface是画布(画框), SurfaceTexture则是一幅画。可以使用new Surface(SurfaceTexture)创建一个Surface。SurfaceTexture并不直接显示图像,而是转为一个外部纹理(图像),用于图像的二次处理。

//创建一个纹理id
int[] mTextures = new int[1];
SurfaceTexture mSurfaceTexture = new SurfaceTexture(mTextures[0]);
//摄像头作为图像流 交给SurfaceTexture处理
Camera.setPreviewTexture(mSurfaceTexture);
//OpengGL可以通过 mTextures 对摄像头图像进行二次处理

码率帧率

​ 视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件。码率和质量成正比,但是文件体积也和码率成正比,即码率越高越清晰,视频文件越大。码率率超过一定数值,对图像的质量没有多大影响,因为原始图像只有那么清晰,再高码率也不会变的比原图更清晰

​ 每秒的帧数表示图形处理器处理场时每秒钟能够更新的次数,一般使用fps(Frames per Second)表示。因此帧率越高,画面越流畅。比如Android理论上是16ms一张图像,即60fps。

ANativeWindow

​ ANativeWindow代表的是本地窗口,可以看成NDK提供Native版本的Surface。通过ANativeWindow_fromSurface获得ANativeWindow指针,ANativeWindow_release进行释放。类似Java,可以对它进行lock、unlockAndPost以及通过ANativeWindow_Buffer进行图像数据的修改。

#include <android/native_window_jni.h>
//先释放之前的显示窗口
if (window) {ANativeWindow_release(window);window = 0;
}
//创建新的窗口用于视频显示
window = ANativeWindow_fromSurface(env, surface);
//设置窗口属性
ANativeWindow_setBuffersGeometry(window, w,h,WINDOW_FORMAT_RGBA_8888);ANativeWindow_Buffer window_buffer;
if (ANativeWindow_lock(window, &window_buffer, 0)) {ANativeWindow_release(window);window = 0;return;
}
//填充rgb数据给dst_data
uint8_t *dst_data = static_cast<uint8_t *>(window_buffer.bits);
//......
ANativeWindow_unlockAndPost(window);

在NDK中使用ANativeWindow编译时需要链接NDK中的libandroid.so

#编译链接NDK/platforms/android-X/usr/lib/libandroid.so
target_link_libraries(XXX android )

Android开发之六:SurfaceView、ANativeWindow原生绘制相关推荐

  1. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( 设置 ANativeWindow 缓冲区属性 | 获取绘制缓冲区 | 填充数据到缓冲区 | 启动绘制 )

    文章目录 I . FFMPEG ANativeWindow 原生绘制 前置操作 II . FFMPEG 原生绘制流程 III . 设置 ANativeWindow 绘制窗口属性 ANativeWind ...

  2. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )

    文章目录 I . FFMPEG ANativeWindow 原生绘制 II . FFMPEG 原生绘制流程 III . Java 层获取 Surface 画布 IV . 传递 Surface 画布到 ...

  3. Android开发丶集成微信原生分享并于分享网页时加载网络缩略图

    微信分享也是一项很常用的功能了,以往都是用友盟或者mobShareSDK框架来实现的,这两者在微信官方的sdk基础上封装的很好,并且加入了一些很实用性的功能,不过这次因为只有微信平台的分享,而且微信登 ...

  4. 【Android开发】图形图像处理技术-绘制几何图形

    常见的几何图形包括点.线.弧.矩形等.在Android中,Canvas类提供了丰富的绘制几何图形的方法,通过这些方法,可以绘制出各种几何图形.常用的几何图形的绘制方法如下所示: 1. 画一个圆使用的是 ...

  5. Android开发使用SurfaceView和Mediaplayer播放网络视频(功能齐全)

    本篇播客主要说明如何使用SurfaceView和Mediaplayer来播放网络视频. 支持视频格式:实测支持的有mp3.mp4.rmvb.avi.3gp.flv--. 带有功能:播放.暂停.视频拖动 ...

  6. Android开发丶集成微信原生登录

    好久没写博客了,大概是与ReactNative大战半月已经有点疲惫了,说起集成微信三方登录,还记得上次实现功能还是刚参加工作时,用Mob的ShareSDK来集成实现的,该平台集成了数个主流平台的分享和 ...

  7. android+canvas+图片,android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)...

    packagenet.yt.yuncare.widgets;importandroid.graphics.Bitmap;importandroid.graphics.Canvas;importandr ...

  8. HenCoder Android 开发进阶:自定义 View 1-5 绘制顺序

    这期是 HenCoder 自定义绘制的第 1-5 期:绘制顺序 之前的内容在这里:  HenCoder Android 开发进阶 自定义 View 1-1 绘制基础  HenCoder Android ...

  9. 推荐扔物线的HenCoder Android 开发进阶系列 后期接着更新

    官网地址:http://hencoder.com/ 我来做一次辛勤的搬运工 HenCoder:给高级 Android 工程师的进阶手册 HenCoder Android 开发进阶: 自定义 View ...

最新文章

  1. pytorch | 深度学习分割网络U-net的pytorch模型实现
  2. 机器学习三要素之策略
  3. weblogic最大线程_处理Weblogic卡住的线程
  4. swift 第四课 随意 设置button 图片和文字 位置
  5. emlog博客主题价值358元lu1.3模板
  6. kali linux卸载lnmp,kali linux 如何安装lnmp 1.2
  7. 数据采集及采集工具八爪鱼的使用
  8. 什么是 GPL GNU,自由软件
  9. eNSP实验二:VLAN划分与配置
  10. ros + gazebo未报错却加载不出来机器人模型 解决办法
  11. Android视频播放器开发
  12. 深入浅出内存管理-memblock
  13. 三台路由器两台计算机华为,两台华为路由器桥接设置方法
  14. TiDB 实战优化之 SQL 常见问题与优化案例
  15. 【一步步学OpenGL 19】 -《镜面反射光》
  16. Redis第六讲 Redis之List底层数据结构实现
  17. 思科Cisco AnyConnect 下载地址(windows、macos、iOS、Android、linux)
  18. (筆記) 如何使用Debussy與ModelSim做Co-Simulation? (SOC) (Verilog) (VHDL) (Debussy) (ModelSim)
  19. .NET C# 判断用户是手机访问还是电脑访问
  20. 期待您加入!CSDN招募优质英文布道者

热门文章

  1. 安卓笔记之xutil下载apk并安装
  2. 01-css经典布局整理-圣杯布局
  3. 2016,回忆与展望
  4. 英文简历应该怎么写?一定要有这六大要素
  5. 推流工具OBS 支持webrtc推流
  6. CAS—修改默认登录页
  7. otn与stn网络_光联网技术标准化体系及其现状_光纤通信
  8. Java默认构造函数的作用
  9. java excel 电话号码_java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来...
  10. 嵌入式大牛详解:嵌入式linux开发流程总结