package com.example.android.foldercamera; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.ImageFormat; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.util.Log; import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.RotateAnimation; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import android.widget.ZoomControls; import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; import java.util.List; import at.markushi.ui.CircleButton; public class MainActivity extends Activity implements SurfaceHolder.Callback { public static final int ORIENTAION_CHANGE = 1; private static final int CAMERA_CONTROL_VALUE = 3; private static final String TAG = "fc"; CustomDialog customDialog; OrientationChangeDetector orientationChangeDetector; PictureSave pictureSave; int currentZoomLevel; double finger_distance = 0; boolean previewRunning = false; //camrea private Camera camera; private Camera.Parameters parameters; private CameraCallback cameraCallback; //surface view private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private Button take_picture_button; //UI elements private ImageView imageView1; private CircleButton fam; private View.OnClickListener famOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "famisclicked"); setCustomDialog(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //camera = Camera.open(); fam = (CircleButton) findViewById(R.id.float_button); fam.setOnClickListener(famOnClickListener); orientationChangeDetector = new OrientationChangeDetector(this); pictureSave = new PictureSave(getApplicationContext()); cameraCallback = new CameraCallback(pictureSave, orientationChangeDetector); surfaceView = (SurfaceView) findViewById(R.id.surfaceView); imageView1 = (ImageView) findViewById(R.id.imageView1); surfaceHolder = surfaceView.getHolder(); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceHolder.addCallback(this); setup_custom_dialog(); setup_tack_picture_button(); } private void setCustomDialog(){ customDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { setPictureSize(); } }); // //Here's the magic.. //Set the dialog to not focusable (makes navigation ignore us adding the window) customDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); //Show the dialog! customDialog.show(); //Set the dialog to immersive customDialog.getWindow().getDecorView().setSystemUiVisibility( getWindow().getDecorView().getSystemUiVisibility()); //Clear the not focusable flag from the window customDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); ; } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); setImmersiveMode(); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); orientationChangeDetector.unregister(); } private void setup_custom_dialog() { customDialog = new CustomDialog(MainActivity.this, pictureSave); customDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { setImmersiveMode(); } }); } private void setup_tack_picture_button() { take_picture_button = (Button) findViewById(R.id.button1); take_picture_button.setTag(0); take_picture_button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //自動對焦 camera.autoFocus(cameraCallback.autoFocusCallback_with_takePicture); } } ); } private void setPictureSize() { //get resolution from shared preference SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); String str_resolution = sharedPreferences.getString(getResources().getString(R.string.pref_resolution_key), getResources().getString(R.string.resolution_large)); int resolution = Integer.parseInt(str_resolution); parameters = camera.getParameters(); PictureSize pictureSave = new PictureSize(parameters, camera.new Size(0,0)); Camera.Size size = pictureSave.getResolution(resolution); parameters.setPictureSize(size.width, size.height); camera.setParameters(parameters); } private void setImmersiveMode() { View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } private void setupZoomControl() { ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomControls); if (parameters.isZoomSupported()) { final int maxZoomLevel = parameters.getMaxZoom(); currentZoomLevel = 0; zoomControls.setIsZoomInEnabled(true); zoomControls.setIsZoomOutEnabled(true); zoomControls.setOnZoomInClickListener(new View.OnClickListener() { @Override public void onClick(View v) { zoomCamera(true); } } ); zoomControls.setOnZoomOutClickListener(new View.OnClickListener() { @Override public void onClick(View v) { zoomCamera(false); } } ); } else { zoomControls.setVisibility(View.GONE); } } public void zoomCamera(boolean zoomInOrOut) { if (camera != null) { Camera.Parameters parameter = camera.getParameters(); if (parameter.isZoomSupported()) { int MAX_ZOOM = parameter.getMaxZoom(); int currentZoom = parameter.getZoom(); if (zoomInOrOut && (currentZoom < MAX_ZOOM && currentZoom >= 0)) { currentZoom = currentZoom + CAMERA_CONTROL_VALUE; parameter.setZoom(currentZoom); } else if (!zoomInOrOut && (currentZoom <= MAX_ZOOM && currentZoom > 0)) { currentZoom = currentZoom - CAMERA_CONTROL_VALUE; parameter.setZoom(currentZoom); } } else Toast.makeText(getApplicationContext(), "Zoom Not Avaliable", Toast.LENGTH_LONG).show(); camera.setParameters(parameter); } } private double handleZoomGesture(MotionEvent event, double mDist) { double newDist = getFingerSpacing(event); if (newDist > mDist) { zoomCamera(true); } else if (newDist < mDist) { zoomCamera(false); } return newDist; } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); setPictureSize(); parameters = camera.getParameters(); try { List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); //looking for resolution for (int i = 0; i < sizes.size(); i++) { Log.d("fc:", sizes.get(i).height + " " + sizes.get(i).width); } Camera.Size cs = sizes.get(0); parameters.setPictureFormat(ImageFormat.JPEG); parameters.setPreviewSize(cs.width, cs.height); camera.setParameters(parameters); //設置參數 camera.setPreviewDisplay(surfaceHolder); //setup zoomcontrol setupZoomControl(); // 鏡頭的方向和手機相差90度,所以要轉向 camera.setDisplayOrientation(90); //攝影頭畫面顯示在Surface上 camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } public void surfaceDestroyed(SurfaceHolder holder) { System.out.println("surfaceDestroyed"); camera.stopPreview(); //關閉預覽 camera.release(); // } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); Log.d(TAG, "pointer count: " + event.getPointerCount()); if (action == MotionEvent.ACTION_DOWN) { camera.autoFocus(cameraCallback.autoFocusCallback_without_takePicture); } if (event.getPointerCount() > 1) { if (action == MotionEvent.ACTION_POINTER_DOWN) { finger_distance = getFingerSpacing(event); Log.d(TAG, "motion event action_pointer_down distance: " + finger_distance); } else if (action == MotionEvent.ACTION_MOVE && parameters.isZoomSupported()) { Log.d(TAG, "motion event action_move"); camera.cancelAutoFocus(); finger_distance = handleZoomGesture(event, finger_distance); } } return true; } //calculate the distance between two fingers private double getFingerSpacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return Math.sqrt(x * x + y * y); } }