码迷,mamicode.com
首页 > 其他好文 > 详细

TakePhoto

时间:2014-09-02 17:14:25      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:des   android   style   blog   http   color   os   io   java   

package com.camera;

import java.io.IOException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	private SurfaceView surfaceView;
	private SurfaceHolder surfaceHolder;
	PickView pickview;
	Camera camera;
	Camera.Parameters parameters;
	Button save_pic;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);
		surfaceView = (SurfaceView) findViewById(R.id.camera_preview);
		save_pic = (Button) findViewById(R.id.save_pic);
		pickview = (PickView) findViewById(R.id.pickview);
		surfaceHolder = surfaceView.getHolder();
		surfaceHolder.setKeepScreenOn(true);
		surfaceView.setFocusable(true);
		surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND);
		surfaceHolder.addCallback(new Callback() {
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {
				// TODO Auto-generated method stub
				camera.stopPreview();
				camera.release();
				camera = null;

			}

			@Override
			public void surfaceCreated(SurfaceHolder holder) {
				// TODO Auto-generated method stub
				if (null == camera) {
					camera = Camera.open();
					try {
						camera.setPreviewDisplay(surfaceHolder);
						initCamera();
						camera.startPreview();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}

			@Override
			public void surfaceChanged(SurfaceHolder holder, int format,
					int width, int height) {
				// 实现自动对焦
				camera.autoFocus(new AutoFocusCallback() {
					@Override
					public void onAutoFocus(boolean success, Camera camera) {
						if (success) {
							initCamera();// 实现相机的参数初始化
							camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
						}
					}

				});
			}

		});
		save_pic.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Bitmap bitmap = pickview.getBitmap();
				Log.v("", "width:" + bitmap.getWidth());
				Log.v("", "height:" + bitmap.getHeight());
			}
		});
	}

	// 相机参数的初始化设置
	private void initCamera() {
		parameters = camera.getParameters();
		// parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
		parameters
				.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
		setDispaly(parameters, camera);
		camera.setParameters(parameters);
		camera.startPreview();
		camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上

	}

	// 控制图像的正确显示方向
	private void setDispaly(Camera.Parameters parameters, Camera camera) {
		if (Build.VERSION.SDK_INT >= 8) {
			setDisplayOrientation(camera, 90);
		} else {
			parameters.setRotation(90);
		}

	}

	// 实现的图像的正确显示
	private void setDisplayOrientation(Camera camera, int i) {
		Method downPolymorphic;
		try {
			downPolymorphic = camera.getClass().getMethod(
					"setDisplayOrientation", new Class[] { int.class });
			if (downPolymorphic != null) {
				downPolymorphic.invoke(camera, new Object[] { i });
			}
		} catch (Exception e) {
			Log.e("Came_e", "图像出错");
		}
	}

}

  

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class PickView extends View {
	private static final int PADDING = 10;
	private static final int SIZE = 100;
	private static final int STROKEWIDTH=2;
	private Paint paintBg;
	private Paint paint;
	private RectF ChooseArea = null;
	private RectF UnChooseAreaTop = null;
	private RectF UnChooseAreaBottom = null;
	private RectF UnChooseAreaRight = null;
	private RectF UnChooseAreaLeft = null;
	private int RectRadio = 0;
	private float ScreenWidth;
	private float ScreenHeight;

	public PickView(Context context, AttributeSet attrs) {
		super(context, attrs);

		ScreenWidth = getResources().getDisplayMetrics().widthPixels;
		ScreenHeight = getResources().getDisplayMetrics().heightPixels;
		RectRadio = (int) (getResources().getDisplayMetrics().density * SIZE);
		ChooseArea = new RectF();
		UnChooseAreaTop = new RectF();
		UnChooseAreaBottom = new RectF();
		UnChooseAreaRight = new RectF();
		UnChooseAreaLeft = new RectF();

		paintBg = new Paint();
		paintBg.setColor(Color.BLACK);
		paintBg.setAlpha(150);
		paintBg.setStyle(Style.FILL);

		paint = new Paint();
		paint.setColor(Color.RED);
		paint.setStrokeWidth(STROKEWIDTH);
		paint.setStyle(Style.STROKE);

		moveChooseArea(ScreenWidth / 2, ScreenHeight / 2);
		this.invalidate();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawRect(ChooseArea, paint);
		canvas.drawRect(UnChooseAreaTop, paintBg);
		canvas.drawRect(UnChooseAreaBottom, paintBg);
		canvas.drawRect(UnChooseAreaRight, paintBg);
		canvas.drawRect(UnChooseAreaLeft, paintBg);
	}

	public void moveChooseArea(float move_x, float move_y) {

		if (move_x > RectRadio + PADDING && move_y > RectRadio + PADDING
				&& move_x < (ScreenWidth - RectRadio - PADDING)
				&& move_y < (ScreenHeight - RectRadio - PADDING)) {
			float left = move_x - RectRadio;
			float top = move_y - RectRadio;
			float right = move_x + RectRadio;
			float bottom = move_y + RectRadio;
			ChooseArea.set(move_x - RectRadio, move_y - RectRadio, move_x
					+ RectRadio, move_y + RectRadio);

			// top
			UnChooseAreaTop.set((float) 0, (float) 0, ScreenWidth,
					(float) (top - STROKEWIDTH));
			// bottom
			UnChooseAreaBottom.set(0, bottom + STROKEWIDTH, ScreenWidth, ScreenHeight);
			// left
			UnChooseAreaRight.set(0, top - STROKEWIDTH, left - STROKEWIDTH, bottom + STROKEWIDTH);
			// right
			UnChooseAreaLeft.set(right + STROKEWIDTH, top - STROKEWIDTH, ScreenWidth, bottom + STROKEWIDTH);

			this.invalidate();
		}

	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_MOVE) {
			moveChooseArea(event.getX(), event.getY());
		}
		return true;
	}

	public Bitmap getBitmap() {
		int left = (int) ChooseArea.left;
		int right = (int) ChooseArea.right;
		int top = (int) ChooseArea.top;
		int bottom = (int) ChooseArea.bottom;
		return Bitmap.createBitmap(getDrawingCache(), left, top, right - left,
				bottom - top);
	}
}

  

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <android.view.SurfaceView
        android:id="@+id/camera_preview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <com.camera.PickView
        android:id="@+id/pickview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerInParent="true"
        android:background="#00000000" />

    <Button
        android:id="@+id/save_pic"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="save" />

</RelativeLayout>

  

TakePhoto

标签:des   android   style   blog   http   color   os   io   java   

原文地址:http://www.cnblogs.com/starblogs/p/3951629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!