使用百度地图仿滴滴定位

SDK版本:Android SDK v4.0.0
先上图看下效果:


最终效果图.png

嘿嘿,还不错吧,中间也算踩了不少坑,想了很多,在这里记录吧,也希望能够给大家带来点参考。如有不足,欢迎指正。

先说下需求:
1、显示自己的位置;
2、可以手动选择位置;

按照百度给的介绍,通过添加markerOptions的方法简单的实现了下(参照OverlayDemo),
效果如下:

demo1.png

感觉有以下的几点不足:
a、marker跟随地图拖拽移动,通过拖拽或者长按的方法选择位置不准确,体验不好;
b、添加的marker图层在定位图层(蓝点)的下面;
改进:
a、marker固定在中间,通过移动地图选择位置;
b、改变marker的层级;

尝试方法:
方法一:(不可取)
通过监听地图的状态,每次更改就把marker的位置重新设置下。起初只是在onMapStatusChangeFinish的时候设置下,但是marker还是会随地图移动,结束的时候会突然跳到中间。后来改为onMapStatusChange中设置,但是还是感觉不流畅。

mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
    @Override
    public void onMapStatusChangeStart(MapStatus mapStatus) {}
    @Override
    public void onMapStatusChange(MapStatus mapStatus) {
        marker.setPosition(mapStatus.target);
    }
    @Override
    public void onMapStatusChangeFinish(MapStatus mapStatus) {}
});

另外,本以为可以通过中的zIndex设置marker的图层,然并卵,所以这种方法就不可用了。

final MarkerOptions markerOptions = new MarkerOptions()
        .position(mBaiduMap.getMapStatus().target)
        //.draggable(true)//可拖拽
        .icon(bitmap)
        .zIndex(12);

final Marker marker = (Marker) mBaiduMap.addOverlay(markerOptions);
//长按定位(改变marker的位置)
mBaiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
    @Override
    public void onMapLongClick(LatLng latLng) {
        marker.setPosition(latLng);
        Toast.makeText(BaseMapDemo.this, "定位成功", Toast.LENGTH_SHORT).show();
    }
});

方法二:
既然要使marker的位置在MapView中间(初始和我的位置重叠),那么我们是否可以和获取我的位置 按钮一样,直接在布局文件中写死呢?这样岂不是不会卡顿,并且层级肯定是在定位层级的上面。事实证明这种方法是可以行的通的,但需要注意的一点是,我们需要处理markerOnClick事件,避免在该区域无法移动底部的地图,另外对于其位置也要进行下处理(我们要使其底部位于MapView的中间),在这里,我起初想法是增大MarginBottom。 后来我想到了另外一种方法,然后就没有对这个做具体的demo。下面我放一个朋友的处理方法(使用Vector处理图片,话说我还是第一次见(⊙﹏⊙)b),大家可以参考下:

demo2.png

布局文件.png
img样式.png

方法三:
通过不断观察滴滴的样式,我觉得肯定有什么是我没有发现的,果然,当我在看文档的时候这么一段话引起了我的注意:

百度地图SDK为广大开发者提供的基础地图和上面的各种覆盖物元素,具有一定的层级压盖关系,具体如下(从下至上的顺序):
1、基础底图(包括底图、底图道路、卫星图、室内图等);
2、瓦片图层(TileOverlay);
3、地形图图层(GroundOverlay);
4、热力图图层(HeatMap);
5、实时路况图图层(BaiduMap.setTrafficEnabled(true););
6、百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true););
7、底图标注(指的是底图上面自带的那些POI元素);
8、几何图形图层(点、折线、弧线、圆、多边形);
9、标注图层(Marker),文字绘制图层(Text);
10、指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针);
11、定位图层(BaiduMap.setMyLocationEnabled(true););
12、弹出窗图层(InfoWindow);
13、自定义View(MapView.addView(View););

没错,就是自定义View,MapView.addView(View);,看到这个更加坚定了我的想法。通过AddView的方法。
关键是怎么使自定义的View添加到指定的位置呢,让我们一起来看下这个方法:

MapView.addView.png

说的很明白了,必须是一个MapViewParams,那这就好办了,我们接着看文档:

class MapViewLayoutParams.png
public static final class MapViewLayoutParams.Builder.png

接下来上代码:

Point point = new Point(mMapView.getWidth() / 2, mMapView.getHeight() /2);//这里指定的是屏幕的坐标
//align 默认垂直下对齐,这样我们就不用自己处理了
MapViewLayoutParams params = new MapViewLayoutParams.Builder()
        .layoutMode(MapViewLayoutParams.ELayoutMode.absoluteMode)
        .height(DensityUtils.dp2px(this, 36))
        .width(DensityUtils.dp2px(this, 16))
        .point(point)
        .build();

mMapView.addView(markLocation, params);
mMapView.refreshDrawableState();

OK,到这里基本上就完事儿了,剩下的就是一些细节的处理,例如为Marker添加AnimationInfoWindow

Animator animUp = ObjectAnimator.ofFloat(markLocation, "translationY", 0f, -30f);
animUp.setDuration(ANIMATION_DURATION);
Animator animDown = ObjectAnimator.ofFloat(markLocation, "translationY", - 30f, 0f);
animDown.setDuration(ANIMATION_DURATION);
final AnimatorSet animatorSet = new AnimatorSet();animatorSet.playSequentially(animUp, animDown);
animatorSet.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {    }
    @Override
    public void onAnimationEnd(Animator animation) {
        mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(infoWindow), mBaiduMap.getMapStatus().target, - (markLocation.getHeight() + 14), listener);//第三个参数调整infoWindow距离中心点的高度
        mBaiduMap.showInfoWindow(mInfoWindow);
    }
    @Override
    public void onAnimationCancel(Animator animation) {    }
    @Override
    public void onAnimationRepeat(Animator animation) {    }
});

//添加InfoWindow
final ImageView infoWindow= new ImageView(getApplicationContext());
infoWindow.setImageResource(R.drawable.icon_position_tips);
infoWindow.setMinimumHeight(DensityUtils.dp2px(this, 42));
infoWindow.setMinimumWidth(DensityUtils.dp2px(this, 91));
final InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() {
    public void onInfoWindowClick() {
        mBaiduMap.hideInfoWindow();
        Toast.makeText(BaseMapDemo.this,
                "定位成功" + mBaiduMap.getMapStatus().target.longitude +", " + mBaiduMap.getMapStatus().target.latitude,
                Toast.LENGTH_LONG).show();
    }
};

大功告成!在这里还要感谢群里的那位朋友Jin丶破的交流。
源码稍后会放到我的github上。
<strong>------------------------- 补充 -------------------------
使用小米手机发现无法定位,即onReceiveLocation没有执行,纠结了大半天,在此提醒大家,一定要添加

<service
    android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote" >
</service>

感谢:http://m.blog.csdn.net/article/details?id=50499795

补充----------------------------
Native method not found:
com.baidu.platform.comjni.engine.JNIEngine.initClass.

该问题是由于.so的没引入导致的。
为了调试方便,减少等待时间,编译时去掉了全部的so文件

buildTypes {
    debug {
        signingConfig signingConfigs.release
        // 需要测趣拍注释掉这里然后rebuild !!
        // 去掉全部的so文件!! 解决debug启动等太久(含lib so的apk有27MB)问题
        //ndk { abiFilters "armeabi" }
    }
    release {
        signingConfig signingConfigs.release
        //开启混淆
        minifyEnabled true
        zipAlignEnabled true
        // 移除无用的resource文件
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
}

跳转:百度论坛

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容