国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android自定義相機實現(xiàn)定時拍照功能

2019-12-12 03:56:26
字體:
供稿:網(wǎng)友

這篇博客為大家介紹Android自定義相機,并且實現(xiàn)倒計時拍照功能。

首先自定義拍照會用到SurfaceView控件顯示照片的預(yù)覽區(qū)域,以下是布局文件:

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent" >   <SurfaceView   android:id="@+id/surface_view"   android:layout_width="match_parent"   android:layout_height="match_parent" />   <RelativeLayout   android:layout_width="match_parent"   android:layout_height="match_parent"   android:orientation="vertical" >    <ImageView    android:id="@+id/start"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_centerHorizontal="true"    android:layout_alignParentBottom="true"    android:layout_marginBottom="10dp"    android:src="@drawable/capture"/>    <TextView    android:id="@+id/count_down"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:layout_gravity="center"    android:gravity="center"    android:textSize="80sp"/>  </RelativeLayout> </FrameLayout> 

MainActivity.java

package com.jackie.timercamera;  import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.hardware.Camera; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.ImageView; import android.widget.TextView;  import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;  public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback,   View.OnClickListener, Camera.PictureCallback {  private SurfaceView mSurfaceView;  private ImageView mIvStart;  private TextView mTvCountDown;   private SurfaceHolder mHolder;   private Camera mCamera;   private Handler mHandler = new Handler();   private int mCurrentTimer = 10;   private boolean mIsSurfaceCreated = false;  private boolean mIsTimerRunning = false;   private static final int CAMERA_ID = 0; //后置攝像頭 // private static final int CAMERA_ID = 1; //前置攝像頭  private static final String TAG = MainActivity.class.getSimpleName();   @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);    initView();   initEvent();  }   @Override  protected void onPause() {   super.onPause();    stopPreview();  }   private void initView() {   mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);   mIvStart = (ImageView) findViewById(R.id.start);   mTvCountDown = (TextView) findViewById(R.id.count_down);  }   private void initEvent() {   mHolder = mSurfaceView.getHolder();   mHolder.addCallback(this);    mIvStart.setOnClickListener(this);  }   @Override  public void surfaceCreated(SurfaceHolder holder) {   mIsSurfaceCreated = true;  }   @Override  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {   startPreview();  }   @Override  public void surfaceDestroyed(SurfaceHolder holder) {   mIsSurfaceCreated = false;  }   private void startPreview() {   if (mCamera != null || !mIsSurfaceCreated) {    Log.d(TAG, "startPreview will return");    return;   }    mCamera = Camera.open(CAMERA_ID);    Camera.Parameters parameters = mCamera.getParameters();   int width = getResources().getDisplayMetrics().widthPixels;   int height = getResources().getDisplayMetrics().heightPixels;   Camera.Size size = getBestPreviewSize(width, height, parameters);   if (size != null) {    //設(shè)置預(yù)覽分辨率    parameters.setPreviewSize(size.width, size.height);    //設(shè)置保存圖片的大小    parameters.setPictureSize(size.width, size.height);   }    //自動對焦   parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);   parameters.setPreviewFrameRate(20);    //設(shè)置相機預(yù)覽方向   mCamera.setDisplayOrientation(90);    mCamera.setParameters(parameters);    try {    mCamera.setPreviewDisplay(mHolder);   } catch (Exception e) {    Log.d(TAG, e.getMessage());   }    mCamera.startPreview();  }   private void stopPreview() {   //釋放Camera對象   if (mCamera != null) {    try {     mCamera.setPreviewDisplay(null);     mCamera.stopPreview();     mCamera.release();     mCamera = null;    } catch (Exception e) {     Log.e(TAG, e.getMessage());    }   }  }   private Camera.Size getBestPreviewSize(int width, int height,            Camera.Parameters parameters) {   Camera.Size result = null;    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {    if (size.width <= width && size.height <= height) {     if (result == null) {      result = size;     } else {      int resultArea = result.width * result.height;      int newArea = size.width * size.height;       if (newArea > resultArea) {       result = size;      }     }    }   }    return result;  }   @Override  public void onClick(View v) {   switch (v.getId()) {    case R.id.start:     if (!mIsTimerRunning) {      mIsTimerRunning = true;      mHandler.post(timerRunnable);     }     break;   }  }   private Runnable timerRunnable = new Runnable() {   @Override   public void run() {    if (mCurrentTimer > 0) {     mTvCountDown.setText(mCurrentTimer + "");      mCurrentTimer--;     mHandler.postDelayed(timerRunnable, 1000);    } else {     mTvCountDown.setText("");      mCamera.takePicture(null, null, null, MainActivity.this);     playSound();      mIsTimerRunning = false;     mCurrentTimer = 10;    }   }  };   @Override  public void onPictureTaken(byte[] data, Camera camera) {   try {    FileOutputStream fos = new FileOutputStream(new File      (Environment.getExternalStorageDirectory() + File.separator +        System.currentTimeMillis() + ".png"));     //旋轉(zhuǎn)角度,保證保存的圖片方向是對的    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);    Matrix matrix = new Matrix();    matrix.setRotate(90);    bitmap = Bitmap.createBitmap(bitmap, 0, 0,      bitmap.getWidth(), bitmap.getHeight(), matrix, true);    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);    fos.flush();    fos.close();   } catch (FileNotFoundException e) {    e.printStackTrace();   } catch (IOException e) {    e.printStackTrace();   }    mCamera.startPreview();  }   /**   * 播放系統(tǒng)拍照聲音   */  public void playSound() {   MediaPlayer mediaPlayer = null;   AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);   int volume = audioManager.getStreamVolume( AudioManager.STREAM_NOTIFICATION);    if (volume != 0) {    if (mediaPlayer == null)     mediaPlayer = MediaPlayer.create(this,       Uri.parse("file:///system/media/audio/ui/camera_click.ogg"));    if (mediaPlayer != null) {     mediaPlayer.start();    }   }  } } 

有兩點需要注意:對于Camera來說,默認(rèn)是橫屏的,所以預(yù)覽的時候和圖片保存的時候都是橫屏的,需要調(diào)整角度。

設(shè)置相機預(yù)覽方法:

//設(shè)置相機預(yù)覽方向mCamera.setDisplayOrientation(90);

保存圖片的時候調(diào)整角度:

效果圖如下:


以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 莱芜市| 常州市| 玉田县| 铁岭市| 通城县| 藁城市| 资溪县| 莒南县| 平乡县| 苏尼特右旗| 类乌齐县| 双鸭山市| 濮阳县| 望奎县| 米泉市| 东兴市| 凤庆县| 洪江市| 龙江县| 焉耆| 浦县| 安远县| 定陶县| 长阳| 乌审旗| 长岭县| 朝阳市| 双城市| 咸宁市| 澜沧| 温宿县| 江安县| 黄大仙区| 锡林郭勒盟| 于都县| 保山市| 东明县| 舞钢市| 永仁县| 沅江市| 张北县|