安卓实景导航

最近项目需求有个奇葩的需求就是说,用户可以实景导航。
刚开始听到这个需求的时候,我都惊呆了,什么叫实景导航?看了下客户的需求文档,才知道是用户想去某个地方,可以打开摄像头,上面要放个箭头指着目的地的方向,一听脑袋大了,什么鬼~但是我们程序员就是解决问题的啊~没办法,硬着头皮往上搞~

首先
1,先确定我们自己的当前的位置(也就是经纬度)

2,目标点的经纬度

3,先判断两个位置的方位

4,利用传感器去导航

这是相关的步骤:
直接上代码

public static double getAngle(double lat1, double lng1, double lat2,double lng2) {
        double x1 = lng1;
        double y1 = lat1;
        double x2 = lng2;
        double y2 = lat2;
        double pi = Math.PI;
        double w1 = y1 / 180 * pi;
        double j1 = x1 / 180 * pi;
        double w2 = y2 / 180 * pi;
        double j2 = x2 / 180 * pi;
        double ret;
        if (j1 == j2) {
            if (w1 > w2)
                return 270; // 北半球的情况,南半球忽略
            else if (w1 < w2)
                return 90;
            else
                return -1;// 位置完全相同
        }
        ret = 4* Math.pow(Math.sin((w1 - w2) / 2), 2)- Math.pow(
                Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)),2);
        ret = Math.sqrt(ret);
        double temp = (Math.sin(Math.abs(j1 - j2) / 2) * (Math.cos(w1) + Math
                .cos(w2)));
        ret = ret / temp;
        ret = Math.atan(ret) / pi * 180;
        if (j1 > j2){ // 1为参考点座标
            if (w1 > w2)
                ret += 180;
            else
                ret = 180 - ret;
        } else if (w1 > w2)
            ret = 360 - ret;
        return ret;
    }
/**
     * @param lat1 纬度1
     * @param lng1 经度1
     * @param lat2 纬度2
     * @param lng2 经度2
     * @return 方向
     */
    public static String getDirection(double lat1, double lng1, double lat2,double lng2) {
        double jiaodu = getAngle(lat1, lng1, lat2, lng2);
        if ((jiaodu <= 10) || (jiaodu > 350))
            return "东";
        if ((jiaodu > 10) && (jiaodu <= 80))
            return "东北";
        if ((jiaodu > 80) && (jiaodu <= 100))
            return "北";
        if ((jiaodu > 100) && (jiaodu <= 170))
            return "西北";
        if ((jiaodu > 170) && (jiaodu <= 190))
            return "西";
        if ((jiaodu > 190) && (jiaodu <= 260))
            return "西南";
        if ((jiaodu > 260) && (jiaodu <= 280))
            return "南";
        if ((jiaodu > 280) && (jiaodu <= 350))
            return "东南";
        return "";
    }

上面代码 咱们就知道方位了
下面就是指向了

float values = event.values[0];//getData(values)
            System.out.println(values);
            animation = new RotateAnimation(predegree,(float) Math.toDegrees(getData(values)),Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); 
            animation.setDuration(200); 
            //handler.sendEmptyMessage(1);
            imageview.startAnimation(animation); 
            predegree=-(float) Math.toDegrees(getData(values)); 

需要用到SensorManager类传感器

public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.AutoFocusCallback {

    private static final String TAG = "CameraSurfaceView";

    private Context mContext;
    private SurfaceHolder holder;
    private Camera mCamera;
    private int mScreenWidth;
    private int mScreenHeight;

    public CameraView(Context context) {
        this(context, null);
    }

    public CameraView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CameraView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        getScreenMetrix(context);
        initView();
    }

    private void getScreenMetrix(Context context) {
        WindowManager WM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        WM.getDefaultDisplay().getMetrics(outMetrics);
        mScreenWidth = outMetrics.widthPixels;
        mScreenHeight = outMetrics.heightPixels;
    }

    private void initView() {
        holder = getHolder();//获得surfaceHolder引用
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置类型
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.i(TAG, "surfaceCreated");
        if (mCamera == null) {
            mCamera = Camera.open();//开启相机
            try {
                mCamera.setPreviewDisplay(holder);//摄像头画面显示在Surface上
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Log.i(TAG, "surfaceChanged");
        mCamera.startPreview();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.i(TAG, "surfaceDestroyed");
        mCamera.stopPreview();//停止预览
        mCamera.release();//释放相机资源
        mCamera = null;
        holder = null;
    }

    @Override
    public void onAutoFocus(boolean success, Camera Camera) {
        if (success) {
            Log.i(TAG, "onAutoFocus success="+success);
        }
    }

}
有这方面需求的朋友,不懂的可以留言给我~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章