安卓实景导航
来源:互联网 发布:淘宝弹力椅套 编辑:程序博客网 时间: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
- 安卓实景导航
- IPHONE实景导航开发总结
- IPHONE实景导航开发总结
- IPHONE实景导航开发总结
- 易图通: "路口三维实景"导航面面观
- IPHONE实景导航开发总结(一)
- 安卓底部导航
- 全球定位实景导航 iOS实用应用周排行
- NavigationDrawerDrawerLayout安卓导航抽屉
- 安卓源码目录导航
- 安卓开发导航栏
- 安卓隐藏导航栏
- 关于安卓导航栏
- 安卓滑动导航栏
- 安卓底部导航栏
- Navigation Drawer DrawerLayout 安卓导航抽屉
- 最新安卓导航装车作业
- 安卓自定义导航栏滚动渐变
- linux(1) -- linux文件权限
- linux中查看文件和目录的命令是什么
- 微信检测工具
- 初学mysql(七)-数据库之视图
- 国密及PKCS7的OID
- 安卓实景导航
- 欢迎使用CSDN-markdown编辑器
- 素数的和
- Struts2的ValueStack(值栈)
- 简易考生管理系统
- hive中使用-e方式执行查询
- csdn博客域名怎么改?
- 菜鸟之路——Spring MVC(九)常用注解
- linux 下用户管理