而在FlutterFragment中RenderMode是通过ARG_FLUTTERVIEW_RENDER_MODE
参数来决定。
思考:为什么透明模式下使用
RenderMode.texture
,而不透明模式下使用RenderMode.surface
显而易见三种渲染模式对应的在FlutterView创建时以来不同的类,分别是:FlutterSurfaceView,FlutterTextureView,FlutterImageView。下面我们一起来看看这三个类。
FlutterSurfaceView分析
===================================================================================
从文中开头大致的类图关系我们知道FlutterSurfaceView、FlutterTextureView和FlutterImageView都是FlutterView的一个成员变量,通过构造函数根据不同的渲染模式传递对应的参数对FlutterView进行初始化。
//继承自SurfaceView,实现RenderSurface接口
public class FlutterSurfaceView extends SurfaceView implements RenderSurface {
private final SurfaceHolder.Callback surfaceCallback =
new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
//…
connectSurfaceToRenderer();
}
@Override
public void surfaceChanged(
@NonNull SurfaceHolder holder, int format, int width, int height) {
//…
changeSurfaceSize(width, height);
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
//…
disconnectSurfaceFromRenderer();
}
};
private void connectSurfaceToRenderer() {
if (flutterRenderer == null || getHolder() == null) {
throw new IllegalStateException(
“connectSurfaceToRenderer() should only be called when flutterRenderer and getHolder() are non-null.”);
}
flutterRenderer.startRenderingToSurface(getHolder().getSurface());
}
/**
当 FlutterSurfaceView 想要开始将 Flutter UI 渲染到此 FlutterSurfaceView 时,由此 FlutterSurfaceView 的所有者调用。
如果 Android android.view.Surface 可用,则此方法会将 android.view.Surface 提供给给定的 FlutterRenderer 以开始将 Flutter 的 UI 渲染到此 *FlutterSurfaceView。
如果还没有 Android android.view.Surface 可用,则此 FlutterSurfaceView 将等到 android.view.Surface 可用,然后将该
android.view.Surface 提供给给定的 FlutterRenderer 以开始将 Flutter 的 UI 渲染到此 FlutterSurfaceView。
*/
public void attachToRenderer(