Most visited

Recently visited

Added in API level 14

TextureView

public class TextureView
extends View

java.lang.Object
   ↳ android.view.View
     ↳ android.view.TextureView


一个TextureView可以用来显示一个内容流。 这样的内容流例如可以是视频或OpenGL场景。 内容流可以来自应用程序的流程以及远程流程。

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

SurfaceView不同的SurfaceView ,TextureView不会创建一个单独的窗口,但其行为与常规视图相同。 这个关键区别允许TextureView被移动,转换,动画等。例如,您可以通过调用myView.setAlpha(0.5f)来制作TextureView半透明。

使用TextureView很简单:你需要做的就是获得它的SurfaceTexture 然后可以使用SurfaceTexture呈现内容。 以下示例演示如何将相机预览渲染到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
      }
  }
 

TextureView的SurfaceTexture可以通过调用getSurfaceTexture()或使用TextureView.SurfaceTextureListener来获得。 了解SurfaceTexture只有在将TextureView附加到窗口后才可用(并且已调用onAttachedToWindow() ),这一点很重要。因此,强烈建议您在SurfaceTexture可用时使用侦听器来通知。

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

也可以看看:

Summary

Nested classes

interface TextureView.SurfaceTextureListener

当与此纹理视图关联的表面纹理可用时,可以使用此侦听器进行通知。

Inherited XML attributes

From class android.view.View

Inherited constants

From class android.view.View

Inherited fields

From class android.view.View

Public constructors

TextureView(Context context)

创建一个新的TextureView。

TextureView(Context context, AttributeSet attrs)

创建一个新的TextureView。

TextureView(Context context, AttributeSet attrs, int defStyleAttr)

创建一个新的TextureView。

TextureView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

创建一个新的TextureView。

Public methods

void buildLayer()

调用此方法不起作用。

final void draw(Canvas canvas)

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

Bitmap getBitmap(int width, int height)

返回关联表面纹理内容的 Bitmap表示。

Bitmap getBitmap()

返回关联表面纹理内容的 Bitmap表示。

Bitmap getBitmap(Bitmap bitmap)

将此视图的表面纹理的内容复制到指定的位图中。

int getLayerType()

总是返回 LAYER_TYPE_HARDWARE

SurfaceTexture getSurfaceTexture()

返回此视图使用的 SurfaceTexture

TextureView.SurfaceTextureListener getSurfaceTextureListener()

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

Matrix getTransform(Matrix transform)

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

boolean isAvailable()

如果与此 SurfaceTexture关联的SurfaceTexture可用于渲染,则返回true。

boolean isOpaque()

指示此视图是否不透明。

Canvas lockCanvas()

开始编辑曲面中的像素。

Canvas lockCanvas(Rect dirty)

就像 lockCanvas()但允许指定一个脏矩形。

void setBackgroundDrawable(Drawable background)

此方法已弃用。 改为使用setBackground(Drawable)

void setForeground(Drawable foreground)

提供要在视图中的所有内容之上呈现的Drawable。

void setLayerPaint(Paint paint)

更新与当前图层一起使用的 Paint对象(仅在当前图层类型未设置为 LAYER_TYPE_NONE )。

void setLayerType(int layerType, Paint paint)

由于TextureView始终被视为硬件层,因此忽略TextureView的图层类型。

void setOpaque(boolean opaque)

指示此TextureView的内容是否不透明。

void setSurfaceTexture(SurfaceTexture surfaceTexture)

将该视图设置为 SurfaceTexture以使用。

void setSurfaceTextureListener(TextureView.SurfaceTextureListener listener)

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

void setTransform(Matrix transform)

设置与此纹理视图关联的转换。

void unlockCanvasAndPost(Canvas canvas)

完成编辑表面中的像素。

Protected methods

void onAttachedToWindow()

这在视图附加到窗口时被调用。

final void onDraw(Canvas canvas)

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

void onSizeChanged(int w, int h, int oldw, int oldh)

当这个视图的大小发生变化时,这在布局期间被调用。

void onVisibilityChanged(View changedView, int visibility)

当视图的可见性或视图的祖先已更改时调用。

Inherited methods

From class android.view.View
From class java.lang.Object
From interface android.graphics.drawable.Drawable.Callback
From interface android.view.KeyEvent.Callback
From interface android.view.accessibility.AccessibilityEventSource

Public constructors

TextureView

Added in API level 14
TextureView (Context context)

创建一个新的TextureView。

Parameters
context Context: The context to associate this view with.

TextureView

Added in API level 14
TextureView (Context context, 
                AttributeSet attrs)

创建一个新的TextureView。

Parameters
context Context: The context to associate this view with.
attrs AttributeSet: The attributes of the XML tag that is inflating the view.

TextureView

Added in API level 14
TextureView (Context context, 
                AttributeSet attrs, 
                int defStyleAttr)

创建一个新的TextureView。

Parameters
context Context: The context to associate this view with.
attrs AttributeSet: The attributes of the XML tag that is inflating the view.
defStyleAttr int: An attribute in the current theme that contains a reference to a style resource that supplies default values for the view. Can be 0 to not look for defaults.

TextureView

Added in API level 21
TextureView (Context context, 
                AttributeSet attrs, 
                int defStyleAttr, 
                int defStyleRes)

创建一个新的TextureView。

Parameters
context Context: The context to associate this view with.
attrs AttributeSet: The attributes of the XML tag that is inflating the view.
defStyleAttr int: An attribute in the current theme that contains a reference to a style resource that supplies default values for the view. Can be 0 to not look for defaults.
defStyleRes int: A resource identifier of a style resource that supplies default values for the view, used only if defStyleAttr is 0 or can not be found in the theme. Can be 0 to not look for defaults.

Public methods

buildLayer

Added in API level 14
void buildLayer ()

调用此方法不起作用。

draw

Added in API level 14
void draw (Canvas canvas)

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

Parameters
canvas Canvas: The Canvas to which the View is rendered.

getBitmap

Added in API level 14
Bitmap getBitmap (int width, 
                int height)

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

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

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

如果在复制过程中发生错误,则会返回空位图。

Parameters
width int: The width of the bitmap to create
height int: The height of the bitmap to create
Returns
Bitmap A valid ARGB_8888 bitmap, or null if the surface texture is not available or width is <= 0 or height is <= 0

也可以看看:

getBitmap

Added in API level 14
Bitmap getBitmap ()

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

此方法返回的位图使用 ARGB_8888像素格式,其尺寸与此视图相同。

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

如果在复制过程中发生错误,则会返回空位图。

Returns
Bitmap A valid ARGB_8888 bitmap, or null if the surface texture is not available or the width <= 0 or the height <= 0

也可以看看:

getBitmap

Added in API level 14
Bitmap getBitmap (Bitmap bitmap)

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

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

如果发生错误,则位图保持不变。

Parameters
bitmap Bitmap: The bitmap to copy the content of the surface texture into, cannot be null, all configurations are supported
Returns
Bitmap The bitmap specified as a parameter
Throws
IllegalStateException if the hardware rendering context cannot be acquired to capture the bitmap

也可以看看:

getLayerType

Added in API level 14
int getLayerType ()

总是返回 LAYER_TYPE_HARDWARE

Returns
int LAYER_TYPE_NONE, LAYER_TYPE_SOFTWARE or LAYER_TYPE_HARDWARE

getSurfaceTexture

Added in API level 14
SurfaceTexture getSurfaceTexture ()

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

Returns
SurfaceTexture

也可以看看:

getTransform

Added in API level 14
Matrix getTransform (Matrix transform)

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

Parameters
transform Matrix: The Matrix in which to copy the current transform. Can be null.
Returns
Matrix The specified matrix if not null or a new Matrix instance otherwise.

也可以看看:

isAvailable

Added in API level 14
boolean isAvailable ()

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

Returns
boolean

isOpaque

Added in API level 14
boolean isOpaque ()

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

Returns
boolean True if this View is guaranteed to be fully opaque, false otherwise.

lockCanvas

Added in API level 14
Canvas lockCanvas ()

开始编辑曲面中的像素。 返回的Canvas可以用来绘制表面的位图。 如果曲面尚未创建或者无法编辑,则返回null。 您通常需要实施onSurfaceTextureAvailable(android.graphics.SurfaceTexture, int, int)以了解Surface何时可供使用。

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

该方法只能在底层曲面尚未被其他生产者所有的情况下使用。 例如,如果正在使用TextureView渲染相机的预览,则不能调用此方法。

Returns
Canvas A Canvas used to draw into the surface.

也可以看看:

lockCanvas

Added in API level 14
Canvas lockCanvas (Rect dirty)

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

Parameters
dirty Rect: Area of the surface that will be modified.
Returns
Canvas A Canvas used to draw into the surface.

也可以看看:

setBackgroundDrawable

Added in API level 14
void setBackgroundDrawable (Drawable background)

此方法已弃用。
改为使用setBackground(Drawable)

Parameters
background Drawable

setForeground

Added in API level 23
void setForeground (Drawable foreground)

提供要在视图中的所有内容之上呈现的Drawable。

Parameters
foreground Drawable: the Drawable to be drawn on top of the children

setLayerPaint

Added in API level 17
void setLayerPaint (Paint paint)

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

的层与可选的相关联Paint实例,其控制层是如何由在屏幕上。 组成图层时考虑以下涂料属性:

如果通过调用 setAlpha(float)将此视图的alpha值设置为<1.0,则该图层的alpha值将被此视图的alpha值所取代。

Parameters
paint Paint: The paint used to compose the layer. This argument is optional and can be null. It is ignored when the layer type is LAYER_TYPE_NONE

setLayerType

Added in API level 14
void setLayerType (int layerType, 
                Paint paint)

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

Parameters
layerType int: The type of layer to use with this view, must be one of LAYER_TYPE_NONE, LAYER_TYPE_SOFTWARE or LAYER_TYPE_HARDWARE
paint Paint: The paint used to compose the layer. This argument is optional and can be null. It is ignored when the layer type is LAYER_TYPE_NONE

setOpaque

Added in API level 14
void setOpaque (boolean opaque)

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

Parameters
opaque boolean: True if the content of this TextureView is opaque, false otherwise

setSurfaceTexture

Added in API level 16
void setSurfaceTexture (SurfaceTexture surfaceTexture)

将该视图设置为SurfaceTexture以使用。 如果该视图已经使用了SurfaceTexture ,它将立即释放并且不再可用。 以前的SurfaceTexture 不会调用onSurfaceTextureDestroyed(SurfaceTexture)回调。 同样, onSurfaceTextureAvailable(SurfaceTexture, int, int)回调叫为SurfaceTexture传递给setSurfaceTexture。 在调用此方法之前,必须从所有OpenGL ES上下文中分离出SurfaceTexture对象。

Parameters
surfaceTexture SurfaceTexture: The SurfaceTexture that the view should use.

也可以看看:

setSurfaceTextureListener

Added in API level 14
void setSurfaceTextureListener (TextureView.SurfaceTextureListener listener)

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

Parameters
listener TextureView.SurfaceTextureListener

也可以看看:

setTransform

Added in API level 14
void setTransform (Matrix transform)

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

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

Parameters
transform Matrix: The transform to apply to the content of this view.

也可以看看:

unlockCanvasAndPost

Added in API level 14
void unlockCanvasAndPost (Canvas canvas)

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

Parameters
canvas Canvas: The Canvas previously returned by lockCanvas()

也可以看看:

Protected methods

onAttachedToWindow

Added in API level 14
void onAttachedToWindow ()

这在视图附加到窗口时被调用。 此时它有一个Surface并将开始绘制。 注意这个函数保证在onDraw(android.graphics.Canvas)之前被调用,但是它可以在第一个onDraw之前的任何时候被调用,包括在onMeasure(int, int)之前或之后。

onDraw

Added in API level 14
void onDraw (Canvas canvas)

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

Parameters
canvas Canvas: The Canvas to which the View is rendered.

onSizeChanged

Added in API level 14
void onSizeChanged (int w, 
                int h, 
                int oldw, 
                int oldh)

当这个视图的大小发生变化时,这在布局期间被调用。 如果您刚刚添加到视图层次结构中,则会使用旧值0调用。

Parameters
w int: Current width of this view.
h int: Current height of this view.
oldw int: Old width of this view.
oldh int: Old height of this view.

onVisibilityChanged

Added in API level 14
void onVisibilityChanged (View changedView, 
                int visibility)

当视图的可见性或视图的祖先已更改时调用。

Parameters
changedView View: The view whose visibility changed. May be this or an ancestor view.
visibility int: The new visibility, one of VISIBLE, INVISIBLE or GONE.

Hooray!