TextureView 以替换 SurfaceView,TextureView

简介: q

设计者其实也想到了这个问题,因此额外提供了一个 SurfaceHolder 的 API 接口,通过该接口,开发者可以直接拿到独立绘图表面的 Canvas 对象,以及对这个画布进行绘制操作:

// /frameworks/base/core/java/android/view/SurfaceHolder.java
public interface SurfaceHolder {
// ...
public Canvas lockCanvas();

public void unlockCanvasAndPost(Canvas canvas);
//...
}
1
2
3
4
5
6
7
8
遗憾的是,即使拿到 Canvas,开发者仍然会受到限制:

// /frameworks/base/core/java/com/android/internal/view/BaseSurfaceHolder.java
public abstract class BaseSurfaceHolder implements SurfaceHolder {

private final Canvas internalLockCanvas(Rect dirty, boolean hardware) {

if (mType == SURFACE_TYPE_PUSH_BUFFERS) {
    throw new BadSurfaceTypeException("Surface type is SURFACE_TYPE_PUSH_BUFFERS");
}
// ...

}
}
1
2
3
4
5
6
7
8
9
10
这里的代码,笔者引用 罗升阳 的 这篇文章 中的一段来解释:

注意,只有在一个 SurfaceView 的绘图表面的类型不是 SURFACE_TYPE_PUSH_BUFFERS 的时候,我们才可以自由地在上面绘制 UI。我们使用 SurfaceView 来显示摄像头预览或者播放视频时,一般就是会将它的绘图表面的类型设置为 SURFACE_TYPE_PUSH_BUFFERS 。在这种情况下,SurfaceView 的绘图表面所使用的图形缓冲区是完全由摄像头服务或者视频播放服务来提供的,因此,我们就不可以随意地去访问该图形缓冲区,而是要由摄像头服务或者视频播放服务来访问,因为该图形缓冲区有可能是在专门的硬件里面分配的。

由此可见,SurfaceView 黑屏问题的原因是综合且复杂的,无论是通过 setZOrderOnTop() 等方法设置为背景透明(但是会在页面层级的最上方),亦或者调整布局参数,都会有大大小小的一些问题。

小结
综合来看,SurfaceView 这些饱受争议的问题,从设计的角度来看,都是有其自身考量的。

而为了解决这些问题,官方后续提供了 TextureView 以替换 SurfaceView,TextureView 的原理是和 View 一样绘制到当前 Activity 的窗口上,因此不存在 SurfaceView 的这些问题。

换个角度来看,由于 TextureView 渲染依赖于主线程,因此也会导致了新的问题出现。除了性能比较 SurfaceView 会有明显下降外,还会有经常掉帧的问题,有机会笔者会另起一篇进行分享。
————————————————

相关文章
|
API 异构计算
SurfaceView 和 TextureView
SurfaceView 和 TextureView
400 0
|
前端开发 Java
|
前端开发
SurfaceView
引用:http://doyee.blog.163.com/blog/static/11563172009102211210787/ 在用SurfaceView进行游戏开发过程中,用到SurfaceHolder来处理它的Canvas上画的效果和动画是必不可少的。
742 0
|
前端开发 Android开发
SurfaceView的那点事儿
SurfaceView的那点事儿
174 0
|
前端开发 Java
surfaceview详解
1.概念       SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。 2.实现方法 1)实现步骤
1419 0
|
前端开发 开发工具 Android开发
Surface、SurfaceView、SurfaceHolder详解
    转载请包含网址:http://blog.csdn.net/pathuang68/article/details/7351317 一、Surface     Surface就是“表面”的意思。
1071 0
|
前端开发 Android开发
Surface和SurfaceView以及SurfaceHolder的认识及使用
MainActivity如下: package cn.testcleancanvas; import android.os.Bundle; import android.
973 0
|
Android开发 异构计算 Java
surfaceview 与 view 的区别
引用:http://www.cnblogs.com/-OYK/archive/2012/03/20/2408324.html 如果你的游戏不吃CPU,用View就比较好,符合标准Android操作方式,由系统决定刷新surface的时机。
1301 0

热门文章

最新文章