package com.mis.ARTestApp;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
public class ARTestAppCameraActivity
extends Activity
implements SurfaceHolder.
Callback, SensorEventListener
{
private SurfaceView mSurfaceView
;
private SurfaceHolder mSurfaceHolder
;
private Camera mCamera =
null;
private boolean mPreviewRunning =
false;
private DrawOnTop mDraw
;
private SensorManager mSensorManager
;
private Sensor mOrientation
;
private Sensor mAccelerometer
;
private float mOrientationValues
[];
private float mAccelerationValues
[];
class DrawOnTop
extends View {
private Bitmap mCompass
;
private final float centerX = 300.0f
;
private final float centerY = 300.0f
;
public DrawOnTop
(Context context
) {
super(context
);
mCompass = BitmapFactory.
decodeResource(getResources
(), R.
drawable.
compass);
}
@
Override
protected void onDraw
(Canvas canvas
) {
Paint paint =
new Paint();
paint.
setStyle(Paint.
Style.
FILL);
paint.
setColor(Color.
RED);
paint.
setStrokeWidth(3.0f
);
//canvas.drawText("Test Text", 200, 200, paint);
//canvas.drawText("X: " + compassX + " Y: " + compassY + " Z: " + compassZ, 400, 200, paint);
//canvas.drawRect(10.0f, 10.0f, 100.0f, 100.0f, paint);
Matrix matrix =
new Matrix
();
if (mOrientationValues
!=
null)
matrix.
postRotate(-mOrientationValues
[0]-
90, mCompass.
getWidth()/
2, mCompass.
getHeight()/
2);
canvas.
drawBitmap(mCompass, matrix, paint
);
if (mAccelerationValues
!=
null)
{
canvas.
drawLine(centerX, centerY, centerX + mAccelerationValues
[1] * 50.0f, centerY + mAccelerationValues
[0] * 50.0f, paint
);
float radius = -mAccelerationValues
[2] * 5.0f
;
if (radius
> 0.0f
)
{
if (radius
> 20.0f
)
radius = 20.0f
;
canvas.
drawCircle(centerX, centerY, radius, paint
);
}
canvas.
drawText("X: " + mAccelerationValues
[0] +
" Y: " + mAccelerationValues
[1] +
" Z: " + mAccelerationValues
[2],
400,
200, paint
);
}
super.
onDraw(canvas
);
}
}
/** Called when the activity is first created. */
@
Override
public void onCreate
(Bundle savedInstanceState
) {
super.
onCreate(savedInstanceState
);
getWindow
().
setFormat(PixelFormat.
TRANSLUCENT);
requestWindowFeature
(Window.
FEATURE_NO_TITLE);
getWindow
().
setFlags(WindowManager.
LayoutParams.
FLAG_FULLSCREEN,
WindowManager.
LayoutParams.
FLAG_FULLSCREEN);
mDraw =
new DrawOnTop
(this);
setContentView
(R.
layout.
camera);
addContentView
(mDraw,
new LayoutParams
(LayoutParams.
FILL_PARENT, LayoutParams.
FILL_PARENT));
mSurfaceView =
(SurfaceView
) findViewById
(R.
id.
surface_camera);
mSurfaceHolder = mSurfaceView.
getHolder();
mSurfaceHolder.
addCallback(this);
mSurfaceHolder.
setType(SurfaceHolder.
SURFACE_TYPE_PUSH_BUFFERS);
mSensorManager =
(SensorManager
)getSystemService
(SENSOR_SERVICE
);
mOrientation = mSensorManager.
getDefaultSensor(Sensor.
TYPE_ORIENTATION);
mAccelerometer = mSensorManager.
getDefaultSensor(Sensor.
TYPE_ACCELEROMETER);
}
public void surfaceCreated
(SurfaceHolder holder
) {
mCamera = Camera.
open();
}
public void surfaceChanged
(SurfaceHolder holder,
int format,
int w,
int h
) {
if (mCamera ==
null)
return;
if (mPreviewRunning
) {
mCamera.
stopPreview();
}
Camera.
Parameters p = mCamera.
getParameters();
p.
setPreviewSize(w, h
);
mCamera.
setParameters(p
);
try {
mCamera.
setPreviewDisplay(holder
);
} catch (IOException e
) {
e.
printStackTrace();
}
mCamera.
startPreview();
mPreviewRunning =
true;
}
public void surfaceDestroyed
(SurfaceHolder holder
) {
mCamera.
stopPreview();
mPreviewRunning =
false;
mCamera.
release();
mCamera =
null;
}
protected void onResume
() {
super.
onResume();
mSensorManager.
registerListener(this, mAccelerometer, SensorManager.
SENSOR_DELAY_GAME);
mSensorManager.
registerListener(this, mOrientation, SensorManager.
SENSOR_DELAY_GAME);
}
protected void onPause
() {
super.
onPause();
mCamera.
stopPreview();
mPreviewRunning =
false;
mSensorManager.
unregisterListener(this);
}
public void onAccuracyChanged
(Sensor sensor,
int accuracy
) {
}
public void onSensorChanged
(SensorEvent event
) {
if (event.
sensor.
getType() == Sensor.
TYPE_ORIENTATION) {
mOrientationValues = event.
values;
}
else if (event.
sensor.
getType() == Sensor.
TYPE_ACCELEROMETER){
mAccelerationValues = event.
values;
}
mDraw.
invalidate();
}
}