首页 清松游戏介绍 正文

surfaceview怎么用?这几个常见问题帮你解决!

今儿个咱来聊聊SurfaceView这玩意儿。一开始接触它的时候,感觉有点懵,不知道这东西到底咋用,跟平时用的View有啥区别。后来经过一番折腾,总算是摸清它的脾气。

SurfaceView初体验

记得我第一次用SurfaceView,是想做一个小游戏,需要不断地刷新画面。按照以前用View的经验,直接在onDraw()方法里画,结果发现画面卡得跟幻灯片似的。后来查资料才知道,View的onDraw()是在主线程里跑的,频繁刷新会阻塞主线程,难怪会卡。

surfaceview怎么用?这几个常见问题帮你解决!

这时候,SurfaceView就派上用场。这哥们儿内部有个Surface,可以在单独的线程里画东西,不耽误主线程的事儿。我赶紧把绘图逻辑搬到SurfaceView里,这下画面流畅多!

踩坑与填坑

小编温馨提醒:本站只提供游戏介绍,下载游戏推荐89游戏,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区

surfaceview怎么用?这几个常见问题帮你解决!

不过用SurfaceView也不是一帆风顺的,我也踩不少坑。

  • 坑一:黑屏问题。有一次,我把应用切到后台,再切回来,发现SurfaceView的区域变成黑的。这可把我给整懵,明明代码没问题。后来我仔细研究一下SurfaceView的生命周期,发现这货在切到后台的时候,会被销毁(surfaceDestroyed()),切回前台的时候,又会新建(surfaceCreated())。新建的时候,会先用黑色把背景给涂上。而我的MediaPlayer因为在后台暂停,没有更新画面,所以SurfaceView就一直保持着黑色的背景。

surfaceview怎么用?这几个常见问题帮你解决!

知道原因就好办。我在应用切到后台的时候,记下当前的播放进度,然后在SurfaceView新建(surfaceCreated())之后,让MediaPlayer跳到记录的进度,这下黑屏问题就解决。

  • 坑二:ACTION_MOVE和ACTION_UP不执行。还有一次,我想给SurfaceView加个触摸事件,结果发现ACTION_MOVEACTION_UP这俩事件死活不触发。这可把我给急坏,难道是SurfaceView不支持这两个事件?后来我在网上搜半天,也没找到啥靠谱的答案。我只能硬着头皮自己试,发现把触摸事件的处理逻辑放到onTouchEvent()里,而不是OnTouchListener里,就一切正常。

SurfaceView进阶

经过这些折腾,我对SurfaceView的理解也更深入。这玩意儿,说白就是个“双缓冲”的View。平时咱们用的View,就像一块黑板,画完直接就显示出来。而SurfaceView,它有两块黑板,一块是前台的,一块是后台的。咱们在后台的黑板上画画,画完,再一下子把后台的黑板换到前台来,这样就避免画面闪烁的问题。SurfaceView特别适合做那些需要频繁刷新的东西,比如游戏、视频播放等等。

surfaceview怎么用?这几个常见问题帮你解决!

SurfaceView的绘制工作是在单独的线程里做的,所以咱们得自己管理这个线程。一般来说,在SurfaceView的生命周期回调方法里,比如surfaceCreated()里启动线程,在surfaceDestroyed()里停止线程,这样比较稳妥。

SurfaceView是个好东西,但用起来也得小心。掌握它的脾气,才能让它乖乖地为咱们服务。希望我今天的分享,能给大家带来一点帮助!

相关推荐