安卓实景导航

来源:互联网 发布:淘宝弹力椅套 编辑:程序博客网 时间:2024/04/30 23:33

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

首先
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);        }    }}有这方面需求的朋友,不懂的可以留言给我~
0 0