Step2 カメラ機能の実装
次はカメラ機能の実装です。ここからはこれまで手付かずだったCameraView.javaを編集していきます。
CameraViewはActivityではなく描画を目的としたViewクラスです。普通ならViewを継承するのですが、今回はSurfaceViewというものを継承します。ViewとSurfaceViewの違いですが、SurfeceViewは描画回数(FPS=Frames Per Second)が多く、ゲームや今回のカメラプレビューのような高速連続描画が必要なシーンで使われます。
同時に、CameraViewのコンストラクタも作成しましょう。
public class CameraView extends SurfaceView{ |
次にSurfaceViewを操作するためにSurfaceHolder.Callbackインターフェースを実装します。これはSurfaceViewが生成されるときや破棄されるときに呼び出される処理を記述するものです。SurfaceHolder.Callbackインターフェースには以下の3つのメソッドが用意されています。
surfaceCreated (SurfaceHolder オブジェクト名) |
サーフェイスを生成する時の処理を記述します。 |
SurfaceChanged (SurfaceHolder オブジェクト名, int format, int w, int h) |
サーフェイスを変更する時の処理を記述します。 formatにはピクセル仕様、w(widthの省略)とh(heightの省略)には画面の大きさの変更を記述します。 |
surfaceDestroyed (SurfaceHolder オブジェクト名) |
サーフェイスを破棄する時の処理を記述します。 |
このままですといまひとつイメージがつかみにくいかもしれませんが、実装しながら慣れていきましょう。
SurfaceHolder.Callbackインターフェースは継承の記述に続けてimplementsを用いてSurfaceHolder.Callbackインターフェースを実装します。
「holder」という名前のSurfaceHolderのオブジェクトを生成しましょう。
クラス内に3つのメソッドも記述しています。
public classCameraView extends SurfaceView implements SurfaceHolder.Callback { //コンストラクタ public void surfaceCreated(SurfaceHolder holder){ |
SurfaceViewを利用するためにgetHolder()にてサーフェイスホルダーを取得し、addCallback()にてコールバックの通知先を指定します。今回は外部に通知するわけではなくCameraViewクラス自身を指定しているので「this」と指定します。
加えて サーフェイスホルダーの種別を設定します。設定は「setType()」というメソッドで行います。ここで指定する種別はプッシュバッファというもので、GPUに処理させる命令リストをメインメモリに蓄積して一度に処理するという設定です。引数は下記のように指定します。
SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS |
それではいよいよカメラについての記述を加えます。 カメラオブジェクトを生成し、サーフェイス生成時にカメラを呼び出した後、表示先としてサーフェイスホルダーを指定します。
カメラの呼び出しは簡単です。オブジェクトに対して以下の命令を記述します。
SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS |
表示先のホルダーの指定は先ほど作成したsurfaceCreated()内に記述します。
public class CameraView extends SurfaceView implements SurfaceHolder.Callback { //コンストラクタ //サーフェイスホルダーの取得とコールバック通知先の指定 public void surfaceCreated(SurfaceHolder holder){ |
続いてはプレビューの設定です。サーフェイス変更時にプレビューを開始するようにします。プレビューの開始には以下のメソッドを利用します。
startPreview() |
変更後は以下の様になります。
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){ |
続いて、サーフェイス破棄時の処理を記述します。
コールバックの値を空にし、プレビュー・ カメラの利用、 オブジェクトを停止します。
public void surfaceDestroyed(SurfaceHolderholder){ |
以上でカメラに関してのプログラミングは終了です。
第5回 カメラを使ってみよう(前編)
Step1 プロジェクトの作成とフルスクリーンの設定
Step2 カメラ機能の実装
Step3 タッチで撮影、保存してみよう