当前位置: 代码迷 >> Android >> android camera摄像surfaceview预览界面特定区域(该区域可移动)
  详细解决方案

android camera摄像surfaceview预览界面特定区域(该区域可移动)

热度:77   发布时间:2016-04-28 07:22:50.0
android camera拍摄surfaceview预览界面特定区域(该区域可移动)

1.自定义一个imageview用来设定surfaceview上的特定区域。

??

public class DrawImageView extends ImageView {	private Paint paint;	private int mFristPointX = 100, mFristPointY = 200;	private int mSecondPointX = 400, mSecondPointY = 500;	private boolean isFirstDown = true;	private int mOldX = 0, mOldY = 0;	public DrawImageView(Context context) {		super(context);		// TODO Auto-generated constructor stub		init();	}	public DrawImageView(Context context, AttributeSet attrs) {		super(context, attrs);		// TODO Auto-generated constructor stub		init();	}	private void init() {		paint = new Paint();		paint.setAntiAlias(true);		paint.setColor(Color.RED);		paint.setStyle(Style.STROKE);		paint.setStrokeWidth(2.5f);		paint.setAlpha(100);	}	@Override	protected void onDraw(Canvas canvas) {		// TODO Auto-generated method stub		super.onDraw(canvas);		canvas.drawRect(new Rect(getmFristPointX(), getmFristPointY(), getmSecondPointX(), getmSecondPointY()), paint);	}	@Override	public boolean onTouchEvent(MotionEvent event) {		// TODO Auto-generated method stub		if (event.getAction() != MotionEvent.ACTION_UP) {			int x = (int) event.getX();			int y = (int) event.getY();			Rect mRect = new Rect(getmFristPointX(), getmFristPointY(), getmSecondPointX(), getmSecondPointY());			if (mRect.contains(x, y)) {				if (isFirstDown) {					mOldX = x;					mOldY = y;					isFirstDown = false;				} else {					int mXDis = x - mOldX;					int mYDis = y - mOldY;					mOldX = x;					mOldY = y;					ReSetVaue(mXDis, mYDis);				}			}		} else {			isFirstDown = true;		}		return true;	}	public void setValue(int x, int y) {		setmFristPointX(x - 50);		setmFristPointY(y - 50);		setmSecondPointX(x + 50);		setmSecondPointY(y + 50);		invalidate();	}	public void ReSetVaue(int xDis, int yDis) {		setmFristPointX(getmFristPointX() + xDis);		setmFristPointY(getmFristPointY() + yDis);		setmSecondPointX(getmFristPointX() + 100);		setmSecondPointY(getmFristPointY() + 100);		invalidate();	}	public int getmFristPointX() {		return mFristPointX;	}	public void setmFristPointX(int mFristPointX) {		this.mFristPointX = mFristPointX;	}	public int getmFristPointY() {		return mFristPointY;	}	public void setmFristPointY(int mFristPointY) {		this.mFristPointY = mFristPointY;	}	public int getmSecondPointX() {		return mSecondPointX;	}	public void setmSecondPointX(int mSecondPointX) {		this.mSecondPointX = mSecondPointX;	}	public int getmSecondPointY() {		return mSecondPointY;	}	public void setmSecondPointY(int mSeconPointY) {		this.mSecondPointY = mSeconPointY;	}}

?2.定义xml布局。

?

??

<FrameLayout                android:layout_width="fill_parent"                android:layout_height="fill_parent"                android:layout_weight="1" >                <SurfaceView                    android:id="@+id/open_camera"                    android:layout_width="fill_parent"                    android:layout_height="fill_parent"                    android:layout_marginLeft="30dp"                    android:layout_marginRight="30dp"                    android:layout_marginTop="15dp" />                <test.camera.cut.DrawImageView                    android:id="@+id/draw_rect"                    android:layout_width="fill_parent"                    android:layout_height="fill_parent"                    android:layout_marginLeft="30dp"                    android:layout_marginRight="30dp"                    android:layout_marginTop="15dp" />            </FrameLayout>

?3.在surfaceChanged中设置参数开始画区域:

?

?

DrawImageView.onDraw(new Canvas());    DrawImageView.setValue(mFirstPointX, mFirstPointY);//左上角点的值

?4.在camera拍照部分进行压缩裁剪。

private Bitmap mBitmap;	private Camera.PictureCallback takePictureCallback = new Camera.PictureCallback() {		@Override		public void onPictureTaken(byte[] data, Camera camera) {			// TODO Auto-generated method stub			if (data != null) {				mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);				camera.stopPreview();			}			Matrix matrix = new Matrix();			matrix.setRotate(90);			Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false);			getSurfaceSize();			Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, SurView_Width, SurView_Height, true);			SaveBitmap(sizeBitmap);			mFirstPointX = mDrawImageView.getmFristPointX() + 50;			mFirstPointY = mDrawImageView.getmFristPointY() + 50;			Bitmap newBitmap = Bitmap.createBitmap(sizeBitmap, mFirstPointX - 50, mFirstPointY - 50, 100, 100);			if (newBitmap != null) {				mTestImageView.setImageBitmap(newBitmap);			}			camera.startPreview();		}	};		private void getSurfaceSize(){		SurView_Width = mSurfaceView.getWidth();		SurView_Height = mSurfaceView.getHeight();	}	private void SaveBitmap(Bitmap bitmap) {		File mpicture = new File(mPath + File.separator + "pic.jpg");		try {			mpicture.createNewFile();			BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(mpicture));			bitmap.compress(CompressFormat.JPEG, 75, outputStream);			outputStream.flush();			outputStream.close();		} catch (Exception e) {			// TODO: handle exception			e.printStackTrace();		}	}

?

?

参考文献: ?http://blog.csdn.net/yanzi1225627/article/details/8580034

?

  相关解决方案