SurfaceViewクラスとは?
状態:-
閲覧数:1,401
投稿日:2018-06-22
更新日:2018-09-02
高速にグラフィックスを描画するためのクラス
描画専門のビュー
・ピクセル単位の高速な描画
・バックグラウンドスレッドで描画処理できる
ゲームなど、速度を求められる場面でよく使用される
・内部にサーフェス(Surface)と呼ばれる高速描画専用のレイヤーを持っている
サーフェス(Surface)への描画
・SurfaceHolderインターフェイス(android.view.SurfaceHolder)を通じで行う
・これにより、サーフェスのサイズと形式の制御、サーフェス内のピクセル編集、サーフェス変更の監視を行うことが出来る
構成
Surfaceとは
画面に描画される内容の生のバッファ(のハンドル)
SurfaceHolder インターフェイス
SurfaceHolderインターフェイス
SurfaceHolder.Callbackインターフェイスを内包している
・Surfaceのピクセルを実際にいじったり、Surfaceの変化を監視する人のためのインターフェイス
SurfaceViewとの関係
SurfaceViewにはgetHolder()メソッドが用意されている
・getHolder()メソッドを使用することで、SurfaceHolder interface のインスタンスを取得できる
基本的な使い方
SurfaceViewを継承したサブクラスを作成
サブクラス内で独自の描画処理を書いていく
※必ず「extends SurfaceView」する必要があるわけではない
public class サブクラス名 extends SurfaceView
SurfaceHolder.Callbackをimplementする
SurfaceViewは自身のSurfaceの状態変化についても監視する必要がある(途中でサイズが変わったら、それに応じて描画内容も調整したりなど)
・そのため、SurfaceHolderからのコールバックを受け取るためのSurfaceHolder.Callbackをimplementする
public class サブクラス名 extends SurfaceView implements SurfaceHolder.Callback
※必ず「extends SurfaceView」する必要があるわけではないpublic class MainActivity extends AppCompatActivity implements SensorEventListener, SurfaceHolder.Callback
SurfaceViewのコンストラクタ
「SurfaceViewを継承したサブクラスのコンストラクタ」の中などで、ホルダーのコールバックに自身をセットしておけば、Surfaceの準備ができたタイミング(実際に描画できるようになったタイミング)等でコールバックが呼ばれるようになる
・getHolder()
public サブクラス名(Context context) {
super(context);
getHolder().addCallback(this);
}
super(context);
getHolder().addCallback(this);
}
public class MainActivity extends AppCompatActivity
implements SensorEventListener, SurfaceHolder.Callback {
//中略
@Override
protected void onCreate(Bundle savedInstanceState) {
//中略
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mHolder = surfaceView.getHolder();
mHolder.addCallback(this);
implements SensorEventListener, SurfaceHolder.Callback {
//中略
@Override
protected void onCreate(Bundle savedInstanceState) {
//中略
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mHolder = surfaceView.getHolder();
mHolder.addCallback(this);
使用例
画面上に表示したボールへ、センサーの値をリアルタイムに反映させる
・JAVA 加速度センサーで玉ころがしアプリ
・Kotlin 加速度センサーで玉ころがしアプリ
・SurfaceView使用する場合は、必ずしも extends SurfaceView しなくてもよい?
SurfaceHolderからはCanvasを取得できるAndroidのSurfaceViewの基礎
SurfaceHolder | Android Developers