1.SurfaceView拥有一个独立的window和surface,surface对应了一块屏幕缓冲区,它可以在一个独立的线程中绘制
android中View为什么必须在UI线程中绘制,参考资料
https://blog.csdn.net/junhzhan/article/details/50757302
理论上,View可以在任何拥有消息循环的线程中绘制,只在WindowManager在addView在这个线程中执行就可以,android中的View之所以在必须在UI线程中绘制,就是因为正常View在向WindowManager中添加的时候,即addView的时候是在UI线程中进行
2.SurfaceView所对应的window层级在宿主View window的下面,所以SurfaceView可以理解为在宿主View上面挖了一个洞,即将SurfaceView所对应的区域设置为透明,这样才能看见SurfaceView的内容
3.调用getHolder获取一个SurfaceHolder对象,SurfaceHolder对象可以添加一个CallBack,CallBack中有三个回调,分别是surfaceCreate,surfaceChange,surfaceDestory,这三个方法分别对应这底层surface的创建和销毁
4.可以通过SurfaceHolder获取一个Canvas,并且可以在子线程中在Canvas上面进行绘制
5.SurfaceView为什么不能进行旋转透明度设置?
我的理解:SurfaceView并没有真正的添加在了宿主View的View树中,只是相当于在宿主View中挖了一个洞,因此不能平移旋转变化,SurfaceView自己不能平移,但是父布局可以平移,这样surfaceView也会跟着平移
6.SurfaceView与TextureView的区别:
1.都可以在子线程中绘制
2.TextureView只能在开启硬件加速的window中使用
3.TextureView可以进行平移,缩放动画
4.TextureView不会创建独立的window