SurfaceViewと通常のViewの違いや簡単な使い方について説明してください。

SurfaceViewと通常のViewの違いは、主に以下の点に現れています。

  1. 描画メカニズム:SurfaceViewは独立した描画スレッドを使用することで、バックグラウンドで描画操作を行うことができ、メインスレッドをブロックすることはありません。一方、通常のViewはメインスレッドでしか描画操作を行うことができません。
  2. SurfaceViewは、非表示の状態でも描画を続けることができますが、通常のViewは非表示の時に描画を停止します。
  3. 描画方法:SurfaceViewはダブルバッファリング機構を使用し、点滅問題を回避することができますが、通常のViewは描画中に点滅する可能性があります。
  4. コントロールの階層:SurfaceViewはウィンドウの最上位にあり、他のViewを覆い隠すことができます。一方、通常のViewはレイアウトの階層に従って描画されます。

SurfaceViewを使用する場合、通常はSurfaceViewを継承したクラスをカスタマイズし、SurfaceHolder.Callbackインターフェースを実装し、描画操作を制御するためのメソッドをオーバーライドする必要があります。具体的な手順は以下の通りです:

  1. SurfaceHolder.Callbackインタフェースを実装したカスタムのSurfaceViewクラスを作成してください。
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    
    private SurfaceHolder holder;
    
    public MySurfaceView(Context context) {
        super(context);
        init();
    }
    
    public MySurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    
    private void init() {
        holder = getHolder();
        holder.addCallback(this);
    }
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // surface创建时调用
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // surface尺寸变化时调用
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // surface销毁时调用
    }
    
    public void drawSomething() {
        // 绘制操作
    }
}
  1. ActivityやFragment内でMySurfaceViewを使用する。
public class MainActivity extends AppCompatActivity {
    
    private MySurfaceView surfaceView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        surfaceView = findViewById(R.id.surface_view);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        
        // 在这里开始绘制
        surfaceView.drawSomething();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        
        // 在这里停止绘制
    }
}

SurfaceHolder.CallbackのsurfaceCreatedメソッドで描画を開始し、surfaceDestroyedメソッドで停止する必要があります。また、メモリリークを防ぐために、SurfaceViewの描画操作を正しく管理するためには、ActivityやFragmentのライフサイクルメソッドを適切に利用する必要があります。

bannerAds