mapView.onResume();//生命周期管理
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();//生命周期管理
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();// 退出时销毁定位
mBaiduMap.setMyLocationEnabled(false);// 关闭定位图层
mapView.onDestroy();// 在activity执行onDestroy时必须调用mMapView.onDestroy()
}
然后就可以运行了,运行看看吧。
可以看到定位还是蛮准的,定位时间取决于你的网速。当然如果你想要地址显示的更精确一些的话,可以修改
可以参照这个表来进行设置
| 显示层级 | 比例尺/米 | 比例尺/公里 |
| — | — | — |
| 4 | 1000000 | 1000 |
| 5 | 500000 | 500 |
| 6 | 200000 | 200 |
| 7 | 100000 | 100 |
| 8 | 50000 | 50 |
| 9 | 25000 | 25 |
| 10 | 20000 | 20 |
| 11 | 10000 | 10 |
| 12 | 5000 | 5 |
| 13 | 2000 | 2 |
| 14 | 1000 | 1 |
| 15 | 500 | 0.5 |
| 16 | 200 | 0.2 |
| 17 | 100 | 0.1 |
| 18 | 50 | 0.05 |
| 19 | 20 | 0.02 |
| 20 | 10 | 0.01 |
| 21 | 5 | 0.005 |
比如说我设置成4层级的
zoom(4.0f)
运行一下:
根据自己的需求来就行了。所以我设置的是13,大概就能看清楚附近的区/县就可以了,因为和风天气API请求的最低单位就是区/县。
当然光是一个当前定位是不足以满足用户的,用户一般是都是想点那里就点那里,你点了没反应就是你的软件有问题,然后直接给你卸载,你哭都没地方哭去。下面来看看具体实现吧。
先声明需要的变量
private Marker marker;//标点也可以说是覆盖物
private BitmapDescriptor bitmap;//标点的图标
private double markerLatitude = 0;//标点纬度
private double markerLongitude = 0;//标点经度
private double latitude;//定位纬度
private double longitude;//定位经度
刚才都说了是点击地图定位,那么肯定就需要一个点击事件对吧。当然这个事件肯定不是常规的View.OnClickListener,而是百度地图已经封装好的点击方法。
/**
- 初始化地图点击
*/
private void initMapOnClick() {
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
//地图内 Poi 单击事件回调函数 那么poi是什么呢?你可以当做兴趣点,
// 比如我想知道我当前所在地有那些餐厅,那么餐厅就是poi,
// 而你点击这个poi就会拿到详情的信息数据,当然不在我的业务需求之内,所以只做解释
@Override
public void onMapPoiClick(MapPoi mapPoi) {
}
//地图单击事件回调函数
@Override
public void onMapClick(LatLng latLng) {
}
});
}
这里添加一个标点marker的图标
可以看到要实现两个构造方法,而我只需要在onMapClick下处理点击之后的业务逻辑就可以了。
//地图单击事件回调函数
@Override
public void onMapClick(LatLng latLng) {
bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka);// 设置marker图标
//通过LatLng获取经纬度
markerLatitude = latLng.latitude;//获取纬度
markerLongitude = latLng.longitude;//获取经度
mBaiduMap.clear();//清除之前的图层
MarkerOptions options = new MarkerOptions()//创建标点marker设置对象
.position(latLng)//设置标点的定位
.icon(bitmap);//设置标点图标
marker = (Marker) mBaiduMap.addOverlay(options);//在地图上显示标点
//点击地图之后重新定位
initLocation();
}
当点击地图时,或者经纬度,然后清除当前的图层,再配置标点的坐标和图标,然后添加到地图上,这时候重新定位一下,定位到标点的这个地方,所以要在监听的回调里面中修改原来的代码
在拿到定位监听到之后首先判断是自动定位,还是点击地图定位。因为如果你点了地图,那么markerLatitude就不会是为0的,因为我在点击地图的时候给markerLatitude赋了值,作为判断条件区分你是自动还是手动。然后赋值给一个全局的经纬度变量,再把这个变量放到定位数据里,再设置成地图中心坐标,最后渲染出来,就可以做到,我点那里就定位到哪里了,指哪打哪。OK,没有效果图那就是扯淡,运行一下:
效果还是不错滴!但是我又想回到原来的位置呢?
Wath!!!!
先来说一下实现的业务逻辑,当我一进入这个页面时,是自动定位的,这是要隐藏自动定位按钮,当我点击定位按钮时,清除标点回到当前定位地址。这个按钮我打算用浮动按钮来做,因为它隐藏和显示的时候会自带动画效果,相当不错。
在build.gradle中添加,有就不用了,然后Sync,否则你找不到这个控件。
implementation ‘com.google.android.material:material:1.0.0’
简单修改activity_map_weather.xml
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id=“@+id/btn_auto_location”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“bottom”
android:layout_marginLeft=“@dimen/dp_50”
android:layout_marginBottom=“@dimen/dp_10”
android:clickable=“true”
android:src=“@mipmap/icon_auto_location”
app:backgroundTint=“@color/transparent_bg_3”
app:backgroundTintMode=“screen”
app:borderWidth=“@dimen/dp_0”
app:fabSize=“mini”
app:hoveredFocusedTranslationZ=“@dimen/dp_18”
app:pressedTranslationZ=“@dimen/dp_18”
app:rippleColor=“@color/blue_one” />
这个按钮会显示在页面的左下角比例尺的左边。
icon_auto_location.png如下,其他的参数都是常规数据,背景颜色尺寸一些都是可以自己写的。
然后回到MapWeatherActivity
@BindView(R.id.btn_auto_location)
FloatingActionButton btnAutoLocation;//重新定位按钮
然后在点击的时候重置标点的经纬度参数值,清除标点,再重新定位
/**
- 点击事件
*/
@OnClick(R.id.btn_auto_location)
public void onViewClicked() {
markerLatitude = 0;
markerLongitude = 0;
marker.remove();//清除标点
initLocation();
}
在定位成功的回调中对定位按钮进行显示和隐藏的控制。
然后在新建一个initView方法,放入进入页面的一些基本配置。
OK,运行一下。
我们已经拿到经纬度信息了,那么这个信息需要转换为实际的位置,否则别人也不知道你定位在哪里,那就没有什么意义了。
先声明地址解析
private GeoCoder geoCoder;//百度地址解析
然后创建一个地址解析结果监听器
/**
- 编码结果监听
*/
private OnGetGeoCoderResultListener onGetGeoCoderResultListener = new OnGetGeoCoderResultListener() {
/**
-
编码结果返回 就是通过具体位置信息获取坐标
-
@param geoCodeResult 编码返回结果
*/
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
}
/**
-
反编码结果返回 就是通过坐标获取具体位置信息
-
@param reverseGeoCodeResult 反编码返回结果
*/
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null
|| reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
// 没有检测到结果
return;
}
ReverseGeoCodeResult.AddressComponent addressDetail = reverseGeoCodeResult.getAddressDetail();
//需要的地址信息就在AddressComponent 里
ToastUtils.showShortToast(context,“地址信息:”+addressDetail.province+addressDetail.city+addressDetail.district+addressDetail.street);
Log.d(“dataStr”,addressDetail.province+addressDetail.city+addressDetail.district+addressDetail.street);
}
};
然后在initView中赋值和添加监听
geoCoder = GeoCoder.newInstance();//赋值
geoCoder.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);//反编码结果监听
最后就是在定位监听返回时获得坐标时,进行反编译
运行一下:
OK,现在已经拿到相应的省市县数据了,那么就可以进行天气的数据渲染和请求了。请看下一篇文章
源码地址:GoodWeather
欢迎 Star 和 Fork
下一篇:Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
其实要轻松掌握很简单,要点就两个:
- 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
- 多练。 (视频优势是互动感强,容易集中注意力)
你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
阿里P7Android高级教程
下面资料部分截图,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。
附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、近期面试跳槽、自身职业规划迷茫的朋友们。
Android核心高级技术PDF资料,BAT大厂面试真题解析;
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
存中…(img-7lJ2sNWS-1712099877813)]
附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、近期面试跳槽、自身职业规划迷茫的朋友们。
Android核心高级技术PDF资料,BAT大厂面试真题解析;
[外链图片转存中…(img-gfQOU3rY-1712099877813)]
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算