Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

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();
    }
}