路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法。
创新互联建站专注于企业成都全网营销、网站重做改版、南靖网站定制设计、自适应品牌网站建设、H5建站、商城网站定制开发、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为南靖等各大城市提供网站开发制作服务。
如果是计算任意两点的距离,自2.0.0版本开始,Android SDK为开发者提供了计算距离的接口(DistanceUtil),具体使用方法如下:
1.GeoPoint p1LL = new GeoPoint(39971802, 116347927);
2.GeoPoint p2LL = new GeoPoint(39892131, 116498555);
3.double distance = DistanceUtil.getDistance(p1LL, p2LL);
如果开发者使用的是1.3.5及以前的版本,在计算任意两点之前的距离时,有如下两种方法:一种利用勾股定理计算,适用于两点距离很近的情况;一种按标准的球面大圆劣弧长度计算,适用于距离较远的情况。
在Android屏幕的空间中,大部分的区域我们都是可以随意绘制,只有一部分区域是显示的固定内容:
其中标题栏是可选的,除了Material风格的应用应用的并不多,页面内容就是android.R.id.content是Activity的主要内容。
而我们主要需要讨论的就是 状态栏和导航栏,因为这两个区域在不同设备类型,不同的Android版本和不同的厂商下大小和效果是不同的,等等。这些差异无疑增加了我们做页面适配的复杂程度,也更容易出现兼容问题。
在2017年下半年iPhone X的发布,引入了刘海屏设备,导致了蓝绿大厂争相效仿,同时又自成一派,颇有一番百家争鸣之象。
这也导致了一个新的问题 刘海区域适配 ,那时候Android才8.1,并没有API来支持这屏幕上这多出来的一块区域,不过好在大部分设备在定制时刘海和状态栏高度是一致的。
终于在2018年发布的Android 9中Google正式支持了刘海屏,定制了规范约束了设备厂商,减轻了刘海屏适配的差异问题,但是根源问题并没有解决。因为刘海区域的存在,可能会出现页面内容被遮挡,比如:启用页广告跳过按钮被遮挡的问题,导致被应用商店拒掉的风险。
不过好在Android 9中要求刘海设备必须有以下行为:
刘海高度默认是和状态栏高度一致依旧没有变,所以问题又回到了状态栏区域的处理 。
所以肯定有同学说了:直接获取状态栏高度不就可以了适配刘海屏了。像这样:
这么说也没有错,大部分情况下是没有问题的。但是既然官方已经适配刘海屏了,也为我们提供了新的API为什么不用呢:
上面的方案实际上可以获取上下左右四个方向的安全距离,但大部分情况我们只需要处理顶部就可以了。实际上这已经可以解决我们的问题了,但是还有更好的解决方案方案:
2.使用ViewCompat工具
实际上屏幕安全距离,基本上全部围绕这一个API,Google也推荐我们这么做,在很多系统控件都能看到它的影子,比如:AppBarLayout、DrawerLayout、NavigationBarView等等都有用到,内部都是来处理系统安全距离的。
系统栏适配
上面提到了手机有各种系统栏(状态栏、导航栏),如果一个全屏+刘海屏+透明系统栏+屏幕旋转的页面处理这些安全距离就更复杂,比如短视频页,这里先给大家列几条可能出现的问题:
这些所有的问题通过ViewCompat.setOnApplyWindowInsetsListener() 来优雅处理,通过 WindowInsetsCompat.getInsets(type) 可以获取系统的各个栏的大小,我们也可以同时获取多个系统栏的高度,各个距离内部会进行累加,返回一个类似Rect的对象,对应屏幕的左上右下需要插入的距离:
然后在对不同位置的控件添加对应的边距。除了上面提到的三种类型的安全距离,还有一些其他的类型,有兴趣的可以自己了解。
ViewCompat.setOnApplyWindowInsetsListener()能解决大部分安全距离的问题,但是有一点它是处理不了的,就是 屏幕圆角,这些安全距离的计算是不处理屏幕圆角的,所以如果有圆角要处理那我们就要另辟蹊径了。
好在Android 12中官方添加了对圆角的支持:
我用了Pixel4真机发现能获取到数据,但是模拟器获取不到。
除了圆角支持,还有对隐私指示器提供了支持:
隐私指示器的范围,主要是 摄像头和麦克风 使用中状态的指示器边界,如果是录制直播或者相机的页面需要处理这个区域。
除了圆角以外,好像没有找到官方对打孔屏的支持,可能后面会加入对打孔屏的支持吧。
两点之间的距离是6378.137。
给定两点的经纬度。计算两点之间的距离。这里要注意经纬度一定要依照顺序填写
1. 利用android中的工具获得,单位是米。
2. 通过计算的方式获得,单位是公里。
当两点的距离较近时使用两种方式计算的结果基本一致,但是当两点的距离比较远时,计算的结果就会相差甚远,比较发现两点之间计算球面距离的方式更加精确一些,更贴近实际距离。本文重点讲解两点之间球面距离的计算方式。