SurfaceView

来源:互联网 发布:java int除法向上取整 编辑:程序博客网 时间:2024/06/03 09:00

继承自View


已知的直接子类有GLSurfaceView、VideoView。
提供一个专门的绘制表面嵌入到view层次结构中。你可以控制表面的格式,比如说它的大小;SurfaceView负责将surface放到屏幕正确的位置。surface是在Z周轴放置的,所以它在持有SurfaceView的窗口下面;SurfaceView在它的窗口上打一个洞来允许它的surface显示。View的层级结构和Surface将负责正确的合成,保证同一层的SurfaceView能够正常的出现在它的上面。这用于叠加放置,例如将一个按钮放在Surface上面,不过请注意这可能会影响性能,因为一个完全透明的组件在每次Surface改变时都会执行。
透明区域使Surface可见是基于在view层次结构的布局位置。如果使用布局后改变属性在SurfaceView顶层绘制一个姊妹view,这个view可能不会很好的与这个surface合成。
访问SurfaceHolder接口提供的surface,可以通过getHolder()方法得到。
Surface将会在SurfaceView的窗口可见时创建;你应该实现surfaceCreated(SurfaceHolder)和surfaceDestroy(SurfaceHolder)来监听窗口出现和消失时Surface的创建和销毁。
这个类的目的是提供一个surface,在这里可以用一个子线程来渲染屏幕。如果你想使用它,那你应该注意一些线程语法:

  • 所有的SurfaceView和SurfaceHolder.Callback方法都必须在运行SurfaceView窗口的线程调用(典型的就是应用的UI线程)。它们必须正确的同步一些状态,这些状态在绘制线程有可能被触碰改变。
  • 你必须确定在Surface有效时(在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroy()之间),绘制线程只触碰Surface。
public Method void draw(Canvas canvas) 手动用给定的画布渲染这个View (包括它的子view)。在这个函数调用之前view的layout必须已经完成。当自定义view的时候,重写onDraw(android.graphics.Canvas)方法,不要重写draw(Canvas canvas)方法。如果你一定要重写这个方法,调用父类的这个方法 boolean gatherTransparentRegion(Region region) RootView使用它进行优化,当View层级结构包含一个或者多个SurfaceView时。SurfaceView总是考虑透明,但是它的孩子不会,因此所有的View对象从全局透明的区域移除 不管透明区域,如果可见的view在这个点是不透明的返回true ;如果window有可能在view后面则返回false SurfaceHolder getHolder 返回SurfaceHolder,用于访问和控制SurfaceView的Surface void setSecure(boolean isSecure) 控制是否保护Surface内容的安全,防止截屏或者非安全显示访问。 注意这个必须在包含这个Surface的的window绑定到window manager之前设置 void setVisible(int visibility) 设置这个view的使能状态 void setZOrderMediaOverlay(boolean isMediaOverlay) 控制这个Surface放在同一个窗口的其它Surface的上面(但仍在窗口本身的下面)。注意,这个必须在包含这个Surface 的window绑定到windowManager之前设置。调用这个函数将会覆盖先前调用setZOrderOnTop(boolean)的设置 void setZOrderOnTop(boolean onTop) 控制这个surface是否放到窗口的上面。通常surface都是在window下面,通过设置这个,可以使Surface放到window的上面。也就是说,没有内容的window,这个在surface顶部的SurfaceView将会可见。注意这个必须在包含surface的window绑定到windowManager之前调用。调用这个函数将会覆盖先前调用setZOrderMediaOverlay(boolean)的设置 Protected Method void dispatchDraw(Canvas canvas) draw方法调用它来绘制子View。它可能在子类重写来控制,只要在绘制它的孩子之前,但是在绘制完自己的view之后。 void onAttachedToWindow() 当view绑定窗口时调用。这时它有一个Surface并且将要开始绘制。注意,这个方法要保证在onDraw之前调用,而且它可能在第一次onDraw之前调用多次–包括在onMeasure(int,int)的前后。 void onDetachedFromWindow() 当view从窗口解绑时调用。这时将不再有Surface进行绘制 void onMeasure(int widthMeasureSpec,int heightMeasureSpec) 测量view和它的内容来决定它的测量宽和测量高。这个方法由measure(int,int)触发,应该在子类重写,这样可以对它的内容进行精确有效的测量。约定:在重写这个方法时,必须调用setMeasuredDimension(int,int)来存储这个View测量到的宽和高。不这样做将触发一个IllegalStateException,从measure(int,int)抛出。调用父类的onMeasure(int,int)是一个有效的使用方式。除非MeasureSpec允许一个大的size,否则基类measure的实现是背景的大小。子类应该重写onMeasure(int,int)来为它的内容提供更好的测量。如果这个方法重写,子类应该负责确定view的width和height的最小值。(getSuggestedMinimumHeight()和getSuggestedMinimumWidth()) void onWindowVisibilityChanged(int visibility) 当窗口包含的内容可见性变化时调用(在GONE,INVISIBLE,VISIBLE之间变化)。注意,这告诉你你的窗口对于window manager是否可见,但并不能告诉你是否是屏幕上的其他窗口挡住了你的窗口。
0 0
原创粉丝点击