最近在写一个工具类,就是有好几个手机自带应用,算是对一些手机多媒体什么的总结。
这里放一个放大镜模板,就是相机+50的放大倍数,用Seekbar来调整放大倍数。
有几个比较重要的参数:
mCamera.setDisplayOrientation(mCameraId == BACK_CAMERA ? ROTATION :ROTATION): 打开后置摄像头并设置旋转角度
parameters.setPictureFormat(PixelFormat.JPEG) :设置像素模式为jpeg模式
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE):持续的对焦(手机要有对焦模式)
parameters.set(“orientation”,”portrait”):设置相机水平模式为竖直parameters.setPreviewSize(PERVIEW_WIDTH,PREVIEW_HEIGHT):赋予提前设置好的宽高
parameters.setRotation(mCameraId == BACK_CAMERA ? ROTATION : REVERT + ROTATION):设置后置摄像头的旋转度
下面是模板
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.SeekBar;
import com.rikka.toolbox.R;
import java.io.IOException;
public class CameraActivity extends Activity implements SurfaceHolder.Callback{
private SurfaceView mSurfaceView;
private int value = 50;
private Camera.Parameters parameters;
private Camera mCamera;
private SurfaceHolder holder;
private boolean mFlag = true;
private int mCameraId= 0 ;
private static final int BACK_CAMERA = 0; //判断相机ID
private static final int ROTATION = 90;
private static final int REVERT = 180;
private static final int PERVIEW_WIDTH = 320;
private static final int PREVIEW_HEIGHT = 240;
private int mZoomMax;
private SeekBar mSeekBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camer);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mSurfaceView = findViewById(R.id.surfaceView);
holder = mSurfaceView.getHolder(); //获得句柄
holder.addCallback(this); //添加回调
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //兼容旧的API
mSeekBar = findViewById(R.id.seekbar);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
value = progress + 50;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//TODO Auto-generator method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
parameters.setZoom(value);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
});
}
@Override
protected void onPause() {
super.onPause();
try{
if(mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}catch (Exception e){
e.printStackTrace();
}
}
private void startCamera(){
if(mFlag){
if(mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
try{
mCamera = Camera.open(mCameraId);
}catch (Exception e){
e.printStackTrace();
}
if(mCamera != null){
mCamera.setDisplayOrientation(mCameraId == BACK_CAMERA ? ROTATION :ROTATION);
parameters = mCamera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.set("orientation","portrait");
parameters.setPreviewSize(PERVIEW_WIDTH,PREVIEW_HEIGHT);
parameters.setRotation(mCameraId == BACK_CAMERA ? ROTATION : REVERT + ROTATION);
mZoomMax = value;
parameters.setZoom(mZoomMax);
mCamera.setParameters(parameters);
try{
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
mFlag = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
startCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
public void onBack(View v){
this.finish();
}
}