Androidプログラミング日記 (仮)  

Camera

あなたは

人目のプログラマーだよ。

Androidプログラミング日記 (仮).

 

 

 

 

キャメラ

今回はカメラ機能のコードをちょっと勉強してみましたよ。携帯にはもはや必須のカメラですが、ちょっとアイディアがあればおもしろそうなアプリが作れそう・・・という安易な考えから手を出すことにしました。カメラ機能を使う。そんな簡単なことでも勉強していると、「そういえばそうっか。」と思うことが多々ありました。たとえば、一言に「カメラ」といってもレンズに映ったものを画面に表示させる。これが基本になっています。この機能に、任意のタイミングの画面表示されているものを画像として保存させる。ここまでが最初から備わっているアプリの機能です。私の中では「カメラ」と言ったら撮るまでがカメラだったのでちょっとだけ驚きでした。しかしパーツを組み合わせてアプリとするのなら、それだけ自由にプログラミングができるかも・・・と夢を見るのでした。

最初に

まずは上記でも書きました基本の「カメラ機能」。ここでいうカメラ機能というのはレンズに映ったものを表示させるだけのコードを書いてみました。

ちなみにですが、eclipse上のスマホエミュレータでカメラ機能のテストをすると、当然ながらレンズなどないので仮想空間にボックスが移動しているような画像が表示されます。逆にそれが表示されれま無事にカメラ機能は無事動いていますよってことですね。

 

ファイル名「Camera3Activity.java」

package and.roid.camera3;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class Camera3Activity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new MainCamera(this));
    }
}
						

ファイル名「MainCamera.java」

package and.roid.camera3;

import java.io.IOException;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainCamera extends SurfaceView implements SurfaceHolder.Callback{

	SurfaceHolder sholder;
    Camera camera;

	public MainCamera(Context context) {
		super(context);
		sholder = getHolder();
		sholder.addCallback(this);
		sholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void surfaceChanged(SurfaceHolder holder,int format, int w, int h) {
		Camera.Parameters parameters =  camera.getParameters();
		parameters.setPreviewSize(w, h);
		camera.setParameters(parameters);
		camera.startPreview();

	}

	public void surfaceCreated(SurfaceHolder holder) {
		camera = Camera.open();
        try {
        	camera.setPreviewDisplay(holder);
        } catch (IOException exception) {
        	camera.release();
        	camera = null;
        }

	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		camera.stopPreview();
		camera.release();
		camera = null;
	}


}

						
 

こんな感じで表示されます。カメラ機能を試す場合は自分のスマホでも試したほうがいいかもしれませんね。

 

これがカメラ機能の基本の基本のきがします。ここから何を加えるかでカメラ機能を使用したアプリに違いがでてくるんではないでしょうか。

SurfaceViewはいままで散々やってきたクラスですのでなにかを付け加えるのも簡単なはず・・・これにいつものタップイベントを追加して、SDカードにでも保存させれば既存のカメラアプリと同じアプリができますね。

わたくしのXperiaはちょっと古いタイプなのですが、購入時にひとつおもしろいアプリを見つけて遊んでいました。それは、このカメラ機能に銃の画像が重なって表示され、画面中央に狙いの十字が書いてあってトリガーボタンを押すとバシュンバシュンと音がなる、ただそれだけのアプリなのですが、レンズに映る現実の画面を仮想画面として使用するあの感じはちょっとおもしろいなぁと思いました。

いま流行り?の期待のプログラミング技術はやはりARでしょう。拡張現実と呼ばれるものですがなかなか難しい技術を使っているので、わたくしごときでは組み込むことさえもままなりません;;しかしさきほど書いたように画面になにか表示させてなにかする・・みたいなことくらいならできそうです。

とりあえず画面の真ん中に青い箱を表示させてみます。

さきほどのプロジェクトに1ファイルだけ追加&Activityクラスに1行追加しました。MainCamera.javaは変更なしでそのままです。

 

ファイル名「Camera3Activity.java」1行追加


package and.roid.camera3;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;

public class Camera3Activity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new MainCamera(this));
		//この1行を追加
        addContentView(new CameraOnView1(this),new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
    }
}
						

ファイル名「CameraOnView1.java」ファイル追加

//別ファイルで表示させたいViewを作成
package and.roid.camera3;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class CameraOnView1 extends View {

	public CameraOnView1(Context context) {
		super(context);
	}
	protected void onDraw(Canvas c) {
		Paint p = new Paint();

		p.setColor(Color.BLUE);
		c.drawRect(200, 400, 300, 500, p);
	}
}
 

こんな感じです

setContentViewでいつも表示させたいレイアウトを指定しています。今回の場合だとSurfaceViewのクラスを指定しています。そしてこのSurfaceViewの表示に追加させるってことで addContentViewというのを使用しています。引数は最初にViewクラスを指定して、あとはこんな感じで・・・ハハ・・・意味などワカルワケガ・・・;;とにかくaddとかついていますしadd=追加ってことですきっと。

CameraOnView1クラスはいつものViewクラスに青いボックスを表示させるだけのものです。

とりあえず基本はできました。これをどうしてやろうかな!(ノープラン)

 

 

 

Androidプログラミング日記 (仮) | サイトマップ | 個人情報保護方針 | 応援メールテヘペロ | ©2012 Japan  相互リンク大募集中です