API 25 (Android 7.1.1 API) view.TextureView

来源:互联网 发布:淘宝网地板棉拖鞋 编辑:程序博客网 时间:2024/05/29 21:18

Android API 25 (Android 7.1.1)


TextureView

public class TextureView

extends View

Added in API level 14

 

java.lang.Object

   ↳android.view.View

    ↳android.view.TextureView

 

【概述】

TextureView可用于显示内容流。 这样的内容流例如可以是视频或OpenGL场景。 内容流可以来自App进程或是远端进程。

TextureView只能在硬件加速窗口中使用。 当在软件中渲染时,TextureView将不会绘制任何东西。

SurfaceView不同,TextureView不会创建单独的窗口,这使得它可以像一般的View一样执行一些变换操作,比如移动,转换,动画等。例如,你可以通过调用myView.setAlpha0.5f)使一个TextureView半透明。

使用TextureView很简单:所有你需要做的是获取它的SurfaceTextureSurfaceTexture可以用于渲染内容。

 

应用程序的视频或者opengl内容往往是显示在一个特别的UI控件中:SurfaceViewSurfaceView的工作方式是创建一个置于应用窗口之后的新窗口。这种 方式的效率非常高,因为SurfaceView窗口刷新的时候不需要重绘应用程序的窗口(android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者 是局部的刷新都会导致整个视图结构全部重绘一次,因此效率非常低下,不过满足普通应用界面的需求还是绰绰有余),但是SurfaceView也有一些非常  不便的限制。

 

因为SurfaceView的内容不在应用窗口上,所以不能使用变换(平移、缩放、旋转等)。也难以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如View.setAlpha()

 

以下示例演示如何将相机预览渲染到TextureView中:

 

 public class LiveCameraActivity extends Activity implements TextureView.SurfaceTextureListener {

      private Camera mCamera;

      private TextureView mTextureView;

 

      protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

 

          mTextureView = new TextureView(this);

          mTextureView.setSurfaceTextureListener(this);

 

          setContentView(mTextureView);

      }

 

      public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

          mCamera = Camera.open();

 

          try {

              mCamera.setPreviewTexture(surface);

              mCamera.startPreview();

          } catch (IOException ioe) {

              // Something bad happened

          }

      }

 

      public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

          // Ignored, Camera does all the work for us

      }

 

      public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

          mCamera.stopPreview();

          mCamera.release();

          return true;

      }

 

      public void onSurfaceTextureUpdated(SurfaceTexture surface) {

          // Invoked every time there's a new Camera preview frame

      }

  }

 

TextureViewSurfaceTexture可以通过调用getSurfaceTexture()或者使用

TextureView.SurfaceTextureListener获得。 重要的是知道SurfaceTexture只有在TextureView附加到一个窗口(和onAttachedToWindow()被调用后)才可用。因此,强烈建议您使用一个监听器在SurfaceTexture可用时通知。

 

重要的是要注意,只有一个生产者可以使用TextureView。 例如,如果使用TextureView显示相机预览,则不能同时使用lockCanvas()绘制到TextureView

 

【嵌套类】

接口   TextureView.SurfaceTextureListener

当与该纹理视图相关联的表面纹理可用时,可以使用该监听器来通知该监听器。

 

【继承自view.View的XML属性】

跳转view.View

 

【公共方法】

buildLayer

void buildLayer ()

API 14

调用此方法没有任何效果。

 

draw

void draw (Canvas canvas)

API 14

TextureView的子类不能使用Canvas对象进行自己的渲染。

 

getBitmap

Bitmap getBitmap ()

Bitmap getBitmap (int width, int height)

API 14

返回关联表面纹理的内容的位图表示。如果表面纹理不可用,则此方法返回null

此方法返回的位图使用ARGB_8888像素格式。

不要从绘图方法(例如onDrawandroid.graphics.Canvas))调用此方法。

如果在复制期间发生错误,则将返回空位图。

 

getBitmap

Bitmap getBitmap (Bitmap bitmap)

API 14

将此视图的表面纹理的内容复制到指定的位图中。如果表面纹理不可用,则不执行复制。表面纹理的内容将被缩放以适合在指定的位图内。

 

getLayerType

int getLayerType ()

API 14

始终返回LAYER_TYPE_HARDWARE

 

getSurfaceTexture

SurfaceTexture getSurfaceTexture ()

API 14

返回此视图使用的SurfaceTexture。 如果视图未附加到窗口或如果表面纹理尚未初始化,则此方法可能返回null

 

getSurfaceTextureListener

TextureView.SurfaceTextureListener getSurfaceTextureListener ()

API 14

返回当前与此纹理视图相关联的TextureView.SurfaceTextureListener

 

getTransform

Matrix getTransform (Matrix transform)

API 14

返回与此纹理视图关联的变换。

 

isAvailable

boolean isAvailable ()

API 14

如果与此TextureView关联的SurfaceTexture可用于渲染,则返回true。 当此方法返回true时,getSurfaceTexture()返回有效的表面纹理。

 

isOpaque

boolean isOpaque ()

API 14

指示此视图是否不透明。不透明视图确保它将使用完全不透明的颜色绘制重叠其边界的所有像素。视图的子类应该尽可能覆盖此方法以指示实例是否不透明。不透明视图由View层次结构以特殊方式处理,可能允许它在无效/绘制通过期间执行优化。

 

lockCanvas

Canvas lockCanvas ()

API 14

开始编辑曲面中的像素。返回的Canvas可以用来绘制表面的位图。 如果表面尚未创建或无法编辑,则返回null。 你通常需要实现onSurfaceTextureAvailableandroid.graphics.SurfaceTextureintint)来找出Surface是否可以使用。

Surface的内容永远不会保留在unlockCanvas()和lockCanvas()之间,因此,Surface区域中的每个像素都必须写入。 此规则的唯一例外是当指定一个脏矩形时,在这种情况下,将保留非脏像素。

仅当基础表面尚未由另一个生产者拥有时,才能使用此方法。例如,如果TextureView用于渲染相机的预览,则无法调用此方法。

 

lockCanvas

Canvas lockCanvas (Rect dirty)

API 14

就像lockCanvas(),但允许指定一个脏矩形。 该矩形内的每个像素都必须写入;但是脏矩形外部的像素将被下一次调用lockCanvas()保留。 如果底层表面纹理不可用,则此方法可返回null(请参阅isAvailable()或如果表面纹理已连接到图像制作者(例如:相机,OpenGL,媒体播放器等)

 

setBackgroundDrawable

void setBackgroundDrawable (Drawable background)

API 14——23

使用 setBackground(Drawable)代替。

setForeground

void setForeground (Drawable foreground)

API 23

提供要在视图中的所有内容之上渲染的Drawable

 

SetLayerPaint

void setLayerPaint (Paint paint)

API 17

更新与当前图层一起使用的Paint对象(仅当当前图层类型未设置为LAYER_TYPE_NONE时使用)。 下一次重绘视图时,将使用提供给setLayerTypeintandroid.graphics.Paint)的Paint的更改属性,但必须调用setLayerPaintandroid.graphics.Paint)以确保立即重绘视图。

 

图层与一个可选的Paint实例相关联,该实例控制图层在屏幕上的组成方式。 在构成层时,考虑涂料的以下性能:

半透明(alpha

混合模式

彩色滤光片

如果此视图通过调用setAlphafloat)将alpha值设置为<1.0,则图层的颜色的alpha值将被此视图的alpha值替代。

 

setLayerType

void setLayerType (int layerType, Paint paint)

API 14

TextureView的图层类型被忽略,因为TextureView总是被视为硬件层。 然而,在渲染此TextureView的内容时,将会考虑提供给此方法的可选涂料。

 

setOpaque

void setOpaque (boolean opaque)

API 14

指示此TextureView的内容是否不透明。 默认情况下,内容假定为不透明。

 

setSurfaceTexture

void setSurfaceTexture (SurfaceTexture surfaceTexture)

API 16

设置要使用的视图的SurfaceTexture。 如果此视图已经使用了SurfaceTexture,它将立即释放并且不再可用。onSurfaceTextureDestroyedSurfaceTexture)回调不会为上一个SurfaceTexture调用。 类似地,onSurfaceTextureAvailableSurfaceTextureintint)回调函数不会调用传递给setSurfaceTextureSurfaceTexture。 在调用此方法之前,SurfaceTexture对象必须与所有OpenGL ES上下文分离。

 

setSurfaceTextureListener

void setSurfaceTextureListener (TextureView.SurfaceTextureListener listener)

API 14

设置用于监听表面纹理事件的TextureView.SurfaceTextureListener

 

setTransform

void setTransform (Matrix transform)

API 14

将变换设置为与此纹理视图相关联。指定的变换适用于底层表面纹理,并且不影响视图本身的大小或位置,仅影响其内容。

某些变换可能会阻止内容绘制此视图边界内包含的所有像素。在这种情况下,请确保此纹理视图未标记为不透明。

 

unlockCanvasAndPost

void unlockCanvasAndPost (Canvas canvas)

API 14

完成编辑曲面中的像素。调用后,表面的当前像素将显示在屏幕上,但其内容丢失,特别是不能保证Surface的内容将保持不变,当lockCanvas()被再次调用。


0 0
原创粉丝点击