1. 看考云 > 知识库 >

surfacechanged,如何让SurfaceView重新启动

本文目录索引

1,如何让SurfaceView重新启动

在surface的大小发生改变时激发
(2)public void surfaceCreated(SurfaceHolder holder){}
/,所有的绘图工作必须得在Surface 被创建之后才能开始。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界.addCallback(callback)添加回调函数---->,并提交改变;/SurfaceHolder; SurfaceView,一般在这里将画图的线程停止如何去使用一个SurfaceView.Callback接口 ---->:继承SurfaceView并实现SurfaceHolder。
整个过程、释放,int width; Canvas绘画 ---->.unlockCanvasAndPost(Canvas canvas)结束锁定画图,一般在这里调用画图的线程。
需要重写的方法
(1)public void surfaceChanged(SurfaceHolder holder;在创建时激发;/:
首先继承SurfaceView并实现SurfaceHolder;销毁时激发,将图形显示;SurfaceHolder.getHolder()获得SurfaceHolder对象 ---->.Callback接口。因为使用SurfaceView 有一个原则,而在Surface 被销毁之前必须结束。可以被直接复制到显存从而显示出来.lockCanvas()获得Canvas对象并锁定画布---->。
(3)public void surfaceDestroyed(SurfaceHolder holder) {}
/,这使得显示速度会非常快,int height){}
/,int format;/SurfaceHolder

如何让SurfaceView重新启动

2,SurfaceView surfaceChanged 怎么才能再次调用

SurfaceView是View的子类,它内嵌了一个专门用于绘制的Surface,你可以控制这个Surface的格式和尺寸,Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)的,说明它总在自己所在窗口的后面。SurfaceView提供了一个可见区域,只有在这个可见区域内的surface内容才可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面有透明控件,那么每次surface变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。
SurfaceView默认使用双缓冲技术的,它支持在子线程中绘制图像,这样就不会阻塞主线程了,所以它更适合于游戏的开发。

SurfaceView的使用
首先继承SurfaceView,并实现SurfaceHolder.Callback接口,实现它的三个方法:surfaceCreated,surfaceChanged,surfaceDestroyed。
surfaceCreated(SurfaceHolder holder):surface创建的时候调用,一般在该方法中启动绘图的线程。
surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸发生改变的时候调用,如横竖屏切换。
surfaceDestroyed(SurfaceHolder holder) :surface被销毁的时候调用,如退出游戏画面,一般在该方法中停止绘图线程。
还需要获得SurfaceHolder,并添加回调函数,这样这三个方法才会执行。

SurfaceView实战
下面通过一个小demo来学习SurfaceView在实际项目中的使用,绘制一个精灵,该精灵有四个方向的行走动画,让精灵沿着屏幕四周不停的行走。

3,surfaceDestroyed什么时候被调用

今天看别人的代码,突然有个疑问,surfaceDestroyed这个函数什么时候被调用呢?

上网搜了一番,基本都说是surface被销毁的时候,才会调用surfaceDestroyed。问题又来了surface什么时候被销毁呢,大家都知道surface是surfaceview的一个专门用于画图的接口,所以当surfaceview的对象销毁时,surface一定也销毁,这时surfaceDestroyed一定会调用。

但是,我看的那个程序明明没有销毁surfaceview了啊。分步调试了一下结果发现一个现象:
有两个继承surfaceview的类分别是 svA和svB这连个类分别定义了各自的对象AView和BView。假设现在activity设置的是AView这个对象,也就是说现在用AView的surface呢。如果这时在activity执行一下代码:
setContentView(Bview);

这时,Aview中的surfaceDestroyed就会被调用,因为现在Bview的surface要接管Aview中的surface,Aview的surface就会销毁,这时必然要调用A的surfaceDestroyed函数。

在这里只是说明一种surfaceDestroyed被调用的情况,因为个人能力有限,只能写到自己发现的一些东西。这时第一次在论坛上写一些东西,希望以后能坚持下去,在接受别人帮助的同时来帮助别人。

最后把android帮助文档surfaceDestroyed调用条件,老外写的简单易懂的原文发过来。

This is called immediately before a surface is being destroyed. After returning from this call, you should no longer try to access this surface. If you have a rendering thread that directly accesses the surface, you must ensure that thread is no longer touching the Surface before returning from this function

4,surfaceDestroyed什么时候被调用

  大家都知道surface是surfaceview的一个专门用于画图的接口,所以当surfaceview的对象销毁时,surface一定也销毁,这时surfaceDestroyed一定会调用。
  有两个继承surfaceview的类分别是 svA和svB这连个类分别定义了各自的对象AView和BView。假设现在activity设置的是AView这个对象,也就是说现在用AView的surface呢。如果这时在activity执行一下代码:

  setContentView(Bview);

  这时,Aview中的surfaceDestroyed就会被调用,因为现在Bview的surface要接管Aview中的surface,Aview的surface就会销毁,这时必然要调用A的surfaceDestroyed函数。

5,android videoview和surfaceview的区别

在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。
这里说下android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas lockCanvas()
Canvas lockCanvas(Rect dirty) 、void removeCallback(SurfaceHolder.Callback callback)、void unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在SurfaceHolder.Callback 接口回调中可以通过重写下面方法实现。

使用的SurfaceView的时候,一般情况下要对其进行创建,销毁,改变时的情况进行监视,这就要用到 SurfaceHolder.Callback.
class XxxView extends SurfaceView implements SurfaceHolder.Callback {

public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
//看其名知其义,在surface的大小发生改变时激发
public void surfaceCreated(SurfaceHolder holder){}
//同上,在创建时激发,一般在这里调用画图的线程。
public void surfaceDestroyed(SurfaceHolder holder) {}
//同上,销毁时激发,一般在这里将画图的线程停止、释放。

}

对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时后来做android 3d OpenGL中的GLSurfaceView也是从该类实现。


SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。
那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。

所以基于以上,根据游戏特点,一般分成两类。

1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。

2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。

3.Android中的SurfaceView类就是双缓冲机制。因此,开发游戏时尽量使用SurfaceView而不要使用View,这样的话效率较高,而且SurfaceView的功能也更加完善。

考虑以上几点,所以我一直都选用 SurfaceView 来进行游戏开发。
那么在以后源码实例中,都会以继承sarfaceView框架来进行演示。

6,如何彻底释放一个SurfaceView

 在surface的大小发生改变时激发
(2)public void surfaceCreated(SurfaceHolder holder){}
/,所有的绘图工作必须得在Surface 被创建之后才能开始。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界.addCallback(callback)添加回调函数---->,并提交改变;/SurfaceHolder; SurfaceView,一般在这里将画图的线程停止如何去使用一个SurfaceView.Callback接口 ---->:继承SurfaceView并实现SurfaceHolder。
整个过程、释放,int width; Canvas绘画 ---->.unlockCanvasAndPost(Canvas canvas)结束锁定画图,一般在这里调用画图的线程。
需要重写的方法
(1)public void surfaceChanged(SurfaceHolder holder;在创建时激发;/:
首先继承SurfaceView并实现SurfaceHolder;销毁时激发,将图形显示;SurfaceHolder.getHolder()获得SurfaceHolder对象 ---->.Callback接口。因为使用SurfaceView 有一个原则,而在Surface 被销毁之前必须结束。可以被直接复制到显存从而显示出来.lockCanvas()获得Canvas对象并锁定画布---->。
(3)public void surfaceDestroyed(SurfaceHolder holder) {}
/,这使得显示速度会非常快,int height){}
/,int format;/SurfaceHolder

7,surfaceview应该怎么销毁

双引号内的字符串中支持转义字符,要在字符串中包含双引号或反斜线,则在其前加一个反斜线,反斜线还可以取消变量替换,你如: $res = "A quote \" and A backslash \\"; $result = 14; print ("The value of \$result is $result.\n")的结果为: The value of $result is 14. 可用\nnn(8进制)或\xnn(16进制)来表示ASCII字符,例如: $result = "\377"; # this is the character 255,or EOF $result = "\xff"; # this is also 255 单引号字符串与双引号字符串有两个区别,一是没有变量替换功能,二是反斜线不支持转义字符(\'除外). 单引号另一个特性是可以跨多行,例如: $text = 'This is two lines of text

8,无法重新启动

尊敬的用户您好!

这是联想常见问题知识库,里面有比较全的答案和知道过程和解析:
http://support1.lenovo.com.cn/lenovo/wsi/Modules/doclist.aspx
有任何问题咨询联想24小时在联想社区与工程师互动:
http://club.lenovo.com.cn/community-computer-lenovo.html?pk_campaign=baidu&pk_kwd=1_00002

期待您满意的评价,感谢您对联想的支持,祝您生活愉快!

9,重新启动

您好: 根据您的描述,如果您的手机出现自动重启的情况,建议您: 1.关机取出电池,使用棉签清洁电池触点和手机连接电池的接触点。然后将电池重新插入到手机中。 2.将近期安装的软件卸载删除,排除是否由于软件不兼容导致。 3.更换其他原装电池尝试。 4.手机中若有外置SD卡,建议暂时取出SD卡观察是否会出现同样的情况。 5.将数据备份(联系人,短信,图片等),恢复出厂设置(设定—重置—恢复出厂设置)后尝试。 6.检查手机是否有固件/系统更新提示。若有,请您将手机升级到最新版本。操作:设定-(一般)-关于设备-系统更新。 若问题依然存在,建议您携带上购机发票、包修卡和手机到当地的三星服务中心,由专业的工程师帮您检测。具体服务中心查询请访问: http://www.samsung.com/cn/support/location/supportServiceLocation.do?page=SERVICE.LOCATION&cid=cn_ppc_support_service_repairnet_120522 欢迎访问三星关怀: http://support.samsung.com.cn/app-cares