Android-カスタムカメラのカウントダウンを実現
13551 ワード
このブログでは、Androidカスタムカメラを紹介し、カウントダウン機能を実現しています
まず、カスタム写真は、SurfaceViewコントロールを使用して写真のプレビュー領域を表示します.以下はレイアウトファイルです.
2つのTextViewは、ヒント情報とカウントダウンを表示するための秒数です.
次はmainActivityの具体的な実装と詳細なコメントです.
コアコードの詳細:
1.Surface Viewを作成する場合、surfaceCreated()メソッドで
for (int i = 0; i < Camera.getNumberOfCameras(); i++){CameraInfo info=new CameraInfo();Camera.getCameraInfo(i,info);//システムのフロントカメラif(info.facing==CameraInfo.CAMERA_FACING_FRONT)を呼び出す{ camera = Camera.open(i); } }
この部分のコードは、カメラを開くときにデフォルトでフロントカメラCameraInfoを開く.CAMERA_FACING_BACKはデフォルトでバックカメラを開く、CameraInfo.CAMERA_FACING_FRONTフロントカメラ
2.写真撮影takePhoto()の方法:
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); timeString = formatDate(); filename = "/data/data/com.example.pujiejiaapp/images/" + timeString + ".jpg"; photo = timeString + ".jpg"; File file = new File(filename); boolean createNewFile = file.createNewFile(); FileOutputStream outStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);
この部分のコードは、撮影した画像をbitmap形式で指定したディレクトリに保存するために保存します.
3.カウントダウン撮影用のサブスレッドを開く
public void run() { while (!stopThread) { try { Thread.sleep(1000); } catch (InterruptedException e) { //TODO Auto-generated catch block e.printStackTrace(); } cameratime--; mHandler.sendEmptyMessage(222); if (cameratime <= 0) { break; } } }
コアコードの詳細な注釈を理解して、意見を提供することを歓迎して、みんなに助けをもたらすことができることを望んで、ありがとうございます!
まず、カスタム写真は、SurfaceViewコントロールを使用して写真のプレビュー領域を表示します.以下はレイアウトファイルです.
2つのTextViewは、ヒント情報とカウントダウンを表示するための秒数です.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#266194" android:orientation="vertical" tools:context=".TestActivity" >
<SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" />
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:orientation="vertical" >
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" " android:textColor="#ff0000" android:textSize="32sp" />
<TextView android:id="@+id/tv_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="10dp" android:gravity="center_horizontal" android:textColor="#266194" android:textSize="32sp" />
</LinearLayout>
</RelativeLayout>
次はmainActivityの具体的な実装と詳細なコメントです.
package com.dhsr.pujiejia.ui; import java.io.File; import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; import android.view.WindowManager; import android.widget.TextView; import com.example.pujiejiaapp.R; @SuppressLint({ "NewApi", "SdCardPath" }) public class CameraActivity extends Activity implements Runnable { //
private SurfaceView surfaceView; private TextView tv_time; //
private int cameratime = 4; private Camera camera; private boolean preview = false; //
private String filename; //
private String timeString; //
private SimpleDateFormat dateFormat; //
private Date date; //
boolean stopThread = false; private File file; String photo; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { int what = msg.what; switch (what) { case 222: tv_time.setText("" + cameratime); if ("0".equals(tv_time.getText().toString())) { tv_time.setText(" !"); takePhoto(); } break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub
super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); CameraActivity.this.setFinishOnTouchOutside(false); //
findView(); surfaceView.getHolder().addCallback(new SufaceListener()); /* Surface , */ surfaceView.getHolder() .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.getHolder().setFixedSize(200, 200); //
} @Override protected void onStart() { // TODO Auto-generated method stub
super.onStart(); //
new Thread(this).start(); } private final class SufaceListener implements SurfaceHolder.Callback { /** * surface */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } /** * surface */ @Override public void surfaceCreated(SurfaceHolder holder) { try { for (int i = 0; i < Camera.getNumberOfCameras(); i++) { CameraInfo info = new CameraInfo(); Camera.getCameraInfo(i, info); //
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { camera = Camera.open(i); } } Camera.Parameters parameters = camera.getParameters(); /* 5 , */ parameters.setPreviewFrameRate(5); /* :jpg */ parameters.setPictureFormat(PixelFormat.JPEG); /* */ parameters.set("jpeg-quality", 85); WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); camera.setParameters(parameters); camera.setPreviewDisplay(surfaceView.getHolder());// SurfaceView
camera.startPreview(); preview = true; } catch (Exception e) { } } /** * surface */ @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera != null) { if (preview) camera.stopPreview(); camera.release(); camera = null; } } } /** * */
private void takePhoto() { //
camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { try { Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); timeString = formatDate(); // data/data
filename = "/data/data/com.example.pujiejiaapp/images/"
+ timeString + ".jpg"; File file = new File(filename); boolean createNewFile = file.createNewFile() System.out.println(" " + createNewFile); System.out.println(file); FileOutputStream outStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream); outStream.flush(); outStream.close(); //
camera.stopPreview(); camera.startPreview(); preview = true; } catch (Exception e) { e.printStackTrace(); } finally { } } }); } @Override public void run() { while (!stopThread) { try { //
Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace(); } cameratime--; mHandler.sendEmptyMessage(222); if (cameratime <= 0) { break; } } } //
private void findView() { surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView); tv_time = (TextView) findViewById(R.id.tv_time); } //
public String formatDate() { date = new Date(System.currentTimeMillis()); //
dateFormat = new SimpleDateFormat("'IMG'_yyyyMMddHHmmss"); return dateFormat.format(date); } @Override protected void onDestroy() { // TODO Auto-generated method stub //
super.onDestroy(); stopThread = true; } }
コアコードの詳細:
1.Surface Viewを作成する場合、surfaceCreated()メソッドで
for (int i = 0; i < Camera.getNumberOfCameras(); i++){CameraInfo info=new CameraInfo();Camera.getCameraInfo(i,info);//システムのフロントカメラif(info.facing==CameraInfo.CAMERA_FACING_FRONT)を呼び出す{ camera = Camera.open(i); } }
この部分のコードは、カメラを開くときにデフォルトでフロントカメラCameraInfoを開く.CAMERA_FACING_BACKはデフォルトでバックカメラを開く、CameraInfo.CAMERA_FACING_FRONTフロントカメラ
2.写真撮影takePhoto()の方法:
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); timeString = formatDate(); filename = "/data/data/com.example.pujiejiaapp/images/" + timeString + ".jpg"; photo = timeString + ".jpg"; File file = new File(filename); boolean createNewFile = file.createNewFile(); FileOutputStream outStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);
この部分のコードは、撮影した画像をbitmap形式で指定したディレクトリに保存するために保存します.
3.カウントダウン撮影用のサブスレッドを開く
public void run() { while (!stopThread) { try { Thread.sleep(1000); } catch (InterruptedException e) { //TODO Auto-generated catch block e.printStackTrace(); } cameratime--; mHandler.sendEmptyMessage(222); if (cameratime <= 0) { break; } } }
コアコードの詳細な注釈を理解して、意見を提供することを歓迎して、みんなに助けをもたらすことができることを望んで、ありがとうございます!