实习杂记(28):SurfaceView+ListView+MediaPlayer滑动时候灰色覆盖等问题

时间:2022-11-23 16:13:32

1.灰色覆盖,或者有一层颜色在上面


这个问题应该是   你给listView加了风格,或者给当前的Window加了风格,因为surfaceView,如果你不设置,应该也有一个默认的颜色值

在listView滑动的时候,每个item应该是都会被重绘的,至少layout事件会走的,导致了surface上面有一层颜色,这个是第一个问题,


2.ListView里面出现视频画面残留

这个问题很尴尬,也是在listView在滑动的时候,但是视频又在播放,而且如果你有切换横竖屏的话,这个问题将变得尤为严重,

具体的原因应该是这样的:本来surfaceView是在item上的,item是一个view,这个播放视频的时候,是由MediaPlayer去把视频的画面setDisplay到surfaceHolder上的,

如果播放视频的是你发生了横竖切换,导致surfaceView的大小发生了变化,MediaPlayer重新去渲染视频图片,再回来,可能就会留有残影,


然后是如果不发生横竖屏切换,也会有残影留下来,是为什么,我想了下原因:

是因为surfaceView他有个特点,当你从window上拿到一个区域的时候,这个区域有些限制,

最显著的特点就是:window给你的区域,你不能滑动,不能平移,不能放大缩小,等等,

因为你申请的surfaceView就只有那么大,不能像平常普通的view一样随便的改变大小,位置,透明度,等等,

那么你在listView滑动的时候,虽然item变了,但是item上的surfaceView没有跟着走,这就导致了,会有残影,这很尴尬,


PS:残影的问题,很麻烦,我还没有想到解决办法,最后的好办法,肯定是自己去绘制了,这个肯定是能够解决的,

然后第二种选择是   :使用TextureView,  用起来跟SurfaceView一样,只是要注意需要开启硬件加速,第二个是必须线程调用播放,


3.透明的问题:  背景有其他的activity界面,


理论上当前的窗口(window)上给一个视图区给你用,然后你再surfview上面绘制的东西会在最上层,

这个时候如果你的surfaceView是以dialog上,或者是PopWindow等形式在当前的activity上显示出来的,没有重新重建activity的话,

你的surfaceView后面会有很多东西,这是第一个,所以建议使用surfaceView的时候最好是在新的activity里面使用


这个透明问题,设置stlye是可以解决的,