首先贴出主要代码
Activity
package cn.yhsh.maptest;
import java.util.ArrayList;
import utils.PoiOverlay;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MapViewLayoutParams;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiBoundSearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
public class MainActivity extends Activity implements OnMarkerClickListener,
OnClickListener, OnLongClickListener {
double weidu = 39.6184470000;
double jindu = 116.4252280000;// 这个是百度地图公司的经纬度坐标点
LatLng point = new LatLng(weidu, jindu);
private IntentFilter filter;
private MapView mv_maptest;
private BaiduMap map;
private View dialog_tv;
private TextView tv_dialog;
private EditText et_serach;
private Button bt_search;
private String et_result;
private PoiInfo poiInfo;
private LinearLayout ll_suofang;
private LinearLayout llweixing;
private LinearLayout ll_search;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initsdk();
setContentView(R.layout.activity_main);
// 拿到mapview控件设置默认缩放比例
mv_maptest = (MapView) findViewById(R.id.mv_maptest);
et_serach = (EditText) findViewById(R.id.et_serach);
bt_search = (Button) findViewById(R.id.bt_search);
Button bt_putong = (Button) findViewById(R.id.bt_putong);
Button bt_weixing = (Button) findViewById(R.id.bt_weixing);
Button bt_jiaotong = (Button) findViewById(R.id.bt_jiaotong);
ImageButton ib_da = (ImageButton) findViewById(R.id.ib_da);
ImageButton ib_xiao = (ImageButton) findViewById(R.id.ib_xiao);
ll_suofang = (LinearLayout) findViewById(R.id.ll_suofang);
llweixing = (LinearLayout) findViewById(R.id.llweixing);
ll_search = (LinearLayout) findViewById(R.id.ll_serach);
map = mv_maptest.getMap();
MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(14);// 设置地图默认缩放比例为10(默认为12)
map.setMapStatus(zoom);
MapStatusUpdate center = MapStatusUpdateFactory.newLatLng(point);
// 设置默认中心店
map.setMapStatus(center);
// 去掉标尺
mv_maptest.showZoomControls(false);
// 去掉缩放按钮
mv_maptest.showScaleControl(false);
boolean menu = mv_maptest.showContextMenu();
Log.e("测试", menu + "");
// 写文字
drawtext();
// 画对话框在地图上面通过点击图片后
dialogpic();
// ❀图片字啊地图上面
drawpictuer();
bt_search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 拿到输入框的内容
et_result = et_serach.getText().toString().trim();
if (!et_result.equals("") && !et_result.equals(null)) {
Toast.makeText(MainActivity.this, et_result,
Toast.LENGTH_LONG).show();
// 搜索资源
serachrescours();
} else {
Toast.makeText(MainActivity.this, "请输入数据再点击查询按钮",
Toast.LENGTH_LONG).show();
}
}
});
// 设置三个按钮点击事件
tv_dialog.setOnClickListener(this);
bt_putong.setOnClickListener(this);
bt_weixing.setOnClickListener(this);
bt_jiaotong.setOnClickListener(this);
ib_da.setOnClickListener(this);
ib_xiao.setOnClickListener(this);
/**
* 长按放大按钮隐藏缩放按钮
*/
ib_da.setOnLongClickListener(this);
bt_putong.setOnLongClickListener(this);
tv_dialog.setOnLongClickListener(this);
bt_search.setOnLongClickListener(this);
}
/**
* 在范围内搜索的方法
*/
private void serachrescours() {
PoiSearch poiS = PoiSearch.newInstance();// 创建对象
poiS.setOnGetPoiSearchResultListener(new Mypoisearch());
PoiBoundSearchOption fanwei = new PoiBoundSearchOption();
LatLngBounds llbs = new LatLngBounds.Builder()
.include(new LatLng(40.7460400000, 114.9219870000))
.include(new LatLng(38.9954100000, 117.7206750000)).build();
fanwei.bound(llbs).keyword(et_result);// 搜索的内容
// 发起范围内搜索
poiS.searchInBound(fanwei);
}
class Mypoisearch implements OnGetPoiSearchResultListener {
@Override
public void onGetPoiDetailResult(PoiDetailResult arg0) {
}
@Override
public void onGetPoiResult(PoiResult result) {
if (result == null
|| result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
Toast.makeText(MainActivity.this, "未找到结果", Toast.LENGTH_LONG)
.show();
return;
}
// 返回搜索结果
PoiOverlay pioo = new MyPoiOverlay(map);
// 设置覆盖物marker点击事件
map.setOnMarkerClickListener(pioo);
// 设置数据
pioo.setData(result);
// 添加地图
pioo.addToMap();
}
// 写一类继承PoiOverlay
class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
/*
* 重写onPoiClick点击事件方法
*/
@Override
public boolean onPoiClick(int i) {
// 拿到结果
PoiResult poiResult = getPoiResult();
poiInfo = poiResult.getAllPoi().get(i);
// 弹出吐司显示点中的点击事件
Toast.makeText(getApplicationContext(), poiInfo.address,
Toast.LENGTH_LONG).show();
// 弹出populowindow
showPopupWindow(getCurrentFocus());
// showPopupWindow(mv_maptest);
return super.onPoiClick(i);
}
}
}
/**
* 显示popupwindow的方法
*/
private void showPopupWindow(View view) {
// 一个自定义的布局,作为显示的内容
View contentView = View.inflate(getApplicationContext(),
R.layout.activity_popupwindow, null);
// 设置按钮的点击事件
TextView button_popuowindow = (TextView) contentView
.findViewById(R.id.tv_popuowindow);
button_popuowindow.setText(poiInfo.address);
button_popuowindow.setTextColor(Color.BLUE);
button_popuowindow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "按钮已被点击",
Toast.LENGTH_SHORT).show();
}
});
final PopupWindow popupWindow = new PopupWindow(contentView,
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, true);
popupWindow.setTouchable(true);
popupWindow.setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
// 这里如果返回true的话,touch事件将被拦截
// 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
}
});
// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
// 我觉得这里是API的一个bug
// popupWindow.setBackgroundDrawable(getResources().getDrawable(
// R.drawable.toum));
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// 设置背景颜色为透明色
// getResources().getDrawable(R.drawable.toum).setAlpha(0);// 设置图片透明度为0
// 设置好参数之后再show
// int[] location = new int [2];
// view.getLocationInWindow(location);
// int x = location[0];
// int y = location[1];
// popupWindow.showAtLocation(view, Gravity.CENTER_HORIZONTAL, x, y);
popupWindow.showAsDropDown(view);// 此方法也可以
// 缩放动画
ScaleAnimation scanim = new ScaleAnimation(0, 1, 0, 1,
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1.0f);
scanim.setDuration(4000);// 四秒钟
// 渐变动画
AlphaAnimation apap = new AlphaAnimation(0.1f, 1.0f);
apap.setDuration(4000);
// 旋转动画
RotateAnimation ra = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.1f, Animation.RELATIVE_TO_SELF,
0.1f);
ra.setDuration(4000);
ra.setFillAfter(true);// 动画执行完后是否停留在执行完的状态
// 组合动画
AnimationSet ams = new AnimationSet(true);// 共享动画插入器
// 添加组合动画
ams.addAnimation(ra);
ams.addAnimation(scanim);
ams.addAnimation(apap);
// 开启动画效果
contentView.startAnimation(ams);
}
private void dialogpic() {
dialog_tv = View.inflate(getApplicationContext(),
R.layout.activity_dialogpic, null);
MapViewLayoutParams params = new MapViewLayoutParams.Builder()
.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)
.position(point).width(MapViewLayoutParams.WRAP_CONTENT)
.height(MapViewLayoutParams.WRAP_CONTENT).build();
mv_maptest.addView(dialog_tv, params);
dialog_tv.setVisibility(View.INVISIBLE);// 首先隐藏
tv_dialog = (TextView) dialog_tv.findViewById(R.id.tv_dialog);
map.setOnMarkerClickListener(this);// 设置点击事件
}
// 打开之前先检验key的正确与否
private void initsdk() {
// 注册广播
filter = new IntentFilter();
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);// 网络连接错误
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);// 校验失败
registerReceiver(new Mybraodcast(), filter);
SDKInitializer.initialize(getApplicationContext());
}
class Mybraodcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// 判断是否成功
if (isNetworkAvailable(MainActivity.this)) {
if (action
.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
Toast.makeText(getApplicationContext(), "校验错误。请检查校验码是否正确。",
Toast.LENGTH_LONG).show();
} else {
if (action
.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
Toast.makeText(getApplicationContext(),
"网络错误。请检查网络是否在正常。", Toast.LENGTH_LONG).show();
}
}
}
}
}
// 设置地图图层
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_1:
map.setMapType(BaiduMap.MAP_TYPE_NORMAL);// 底图
map.setTrafficEnabled(false);// 关闭交通图
break;
case KeyEvent.KEYCODE_2:
map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 卫星地图
map.setTrafficEnabled(false);// 关闭交通图
break;
case KeyEvent.KEYCODE_3:
map.setTrafficEnabled(true);// 打开交通图
break;
case KeyEvent.KEYCODE_4:
MapStatusUpdate zoomin = MapStatusUpdateFactory.zoomIn();// 一级一级缩放
// 放大
map.setMapStatus(zoomin);
break;
case KeyEvent.KEYCODE_5:
MapStatusUpdate zoomout = MapStatusUpdateFactory.zoomOut();// 一级一级缩放
// 缩小
map.setMapStatus(zoomout);
break;
case KeyEvent.KEYCODE_6:
float jiaodu = map.getMapStatus().rotate;
MapStatus roates = new MapStatus.Builder().rotate(jiaodu + 15)
.build();
MapStatusUpdate roate = MapStatusUpdateFactory.newMapStatus(roates);
// 旋转
map.setMapStatus(roate);
break;
case KeyEvent.KEYCODE_7:
float jiaodus = map.getMapStatus().overlook;
MapStatus roatelines = new MapStatus.Builder()
.overlook(jiaodus - 5).build();
MapStatusUpdate roateline = MapStatusUpdateFactory
.newMapStatus(roatelines);
// 一条线旋转
map.setMapStatus(roateline);
break;
case KeyEvent.KEYCODE_8:
MapStatusUpdate move = MapStatusUpdateFactory.newLatLng(new LatLng(
39.9899560000, 116.3230660000));// 中关村地铁经纬度坐标
// 移动
map.animateMapStatus(move);
break;
case KeyEvent.KEYCODE_9:
MapStatusUpdate center = MapStatusUpdateFactory.newLatLng(point);
// 设置默认中心店
map.setMapStatus(center);
break;
}
return super.onKeyDown(keyCode, event);
}
/**
* 检测网络是否可用
*
* @return
*/
// public boolean isNetworkConnected() {
// ConnectivityManager cm = (ConnectivityManager)
// getSystemService(Context.CONNECTIVITY_SERVICE);
// NetworkInfo ni = cm.getActiveNetworkInfo();
// return ni != null && ni.isConnectedOrConnecting();
// }
public static boolean isNetworkAvailable(Activity activity) {
Context context = activity.getApplicationContext();
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return false;
} else {
// 获取NetworkInfo对象
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
if (networkInfo != null && networkInfo.length > 0) {
for (int i = 0; i < networkInfo.length; i++) {
// 判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
// 在中心点地图位置写文字标注信息
private void drawtext() {
TextOptions text = new TextOptions();
text.position(point).// 需要标注的点的经纬度
bgColor(0x01ffffff).// 文字背景色
fontColor(0x99ff0000).// 文字颜色
fontSize(24).// 字体大小
text("北京技术股份有限公司").// 文字信息
typeface(Typeface.MONOSPACE).// 安卓字体
rotate(0);// .visible(false);//旋转45°,隐藏文字信息
map.addOverlay(text);// 将文字信息添加到地图上面
}
/**
* 画图片在地图上面
*/
private void drawpictuer() {
MarkerOptions pictuer = new MarkerOptions();
// 设置坐标位置
pictuer.position(new LatLng(weidu + 0.005, jindu - 0.0005))
.title("扬宏豕慧官方店铺(长按此处可以搜索全局\n点击此处可隐藏搜索框)")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.caiguan));
map.addOverlay(pictuer);
pictuer.position(new LatLng(weidu + 0.02, jindu + 0.005))
.title("扬宏豕慧店铺(长按此处可以搜索全局\n点击此处可隐藏搜索框)")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.caiguan))
.draggable(true);// 可以被拖拽
map.addOverlay(pictuer);
ArrayList<BitmapDescriptor> pic = new ArrayList<BitmapDescriptor>();
pic.add(BitmapDescriptorFactory.fromResource(R.drawable.caiguan));
pic.add(BitmapDescriptorFactory.fromResource(R.drawable.ya));
pic.add(BitmapDescriptorFactory.fromResource(R.drawable.wifi));
pic.add(BitmapDescriptorFactory.fromResource(R.drawable.jia));
pictuer.position(new LatLng(weidu + 0.002, jindu - 0.0085))
.title("扬宏豕慧周黑鸭(长按此处可以搜索全局\n点击此处可隐藏搜索框)").icons(pic)
.draggable(true);// 可以被拖拽
map.addOverlay(pictuer);
}
/**
* 设置覆盖物的点击事件
*/
@Override
public boolean onMarkerClick(Marker marker) {
MapViewLayoutParams params = new MapViewLayoutParams.Builder()
.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)
.position(marker.getPosition())
.width(MapViewLayoutParams.WRAP_CONTENT)
.height(MapViewLayoutParams.WRAP_CONTENT).yOffset(-40).// 标示在点中的物体上面10距离
build();
mv_maptest.updateViewLayout(dialog_tv, params);
tv_dialog.setText(marker.getTitle());
dialog_tv.setVisibility(View.VISIBLE);// 点击后显示对话框
return true;// 标示消费
}
// 卫星图切换功能
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_putong:
map.setMapType(BaiduMap.MAP_TYPE_NORMAL);// 底图
map.setTrafficEnabled(false);// 关闭交通图
break;
case R.id.bt_weixing:
map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 卫星地图
map.setTrafficEnabled(false);// 关闭交通图
break;
case R.id.bt_jiaotong:
map.setTrafficEnabled(true);// 打开交通图
break;
case R.id.ib_da:
MapStatusUpdate zoomin = MapStatusUpdateFactory.zoomIn();// 一级一级缩放
// 放大
map.setMapStatus(zoomin);// 放大地图
break;
case R.id.ib_xiao:
MapStatusUpdate zoomout = MapStatusUpdateFactory.zoomOut();// 一级一级缩放
// 缩小
map.setMapStatus(zoomout);// 缩小地图
break;
case R.id.tv_dialog:
ll_search.setVisibility(View.GONE);// 隐藏搜索框
break;
}
}
@Override
public boolean onLongClick(View v) {
switch (v.getId()) {
case R.id.ib_da:
ll_suofang.setVisibility(View.GONE);// 隐藏缩放按钮
break;
case R.id.bt_putong:
llweixing.setVisibility(View.GONE);// 隐藏卫星地图切换
break;
case R.id.tv_dialog:
ll_search.setVisibility(View.VISIBLE);// 显示搜索框
llweixing.setVisibility(View.VISIBLE);// 显示维修地图按钮
ll_suofang.setVisibility(View.VISIBLE);// 显示缩放按钮
break;
case R.id.bt_search:
ll_search.setVisibility(View.GONE);// 隐藏搜索框
break;
}
return true;
}
}
再贴出activity_main xml布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.baidu.mapapi.map.MapView
android:id="@+id/mv_maptest"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.baidu.mapapi.map.MapView>
<LinearLayout
android:id="@+id/ll_serach"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<!-- ##e0ffffff半透明背景色颜色 android:alpha="0.5"透明方法 -->
<EditText
android:id="@+id/et_serach"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:alpha="0.5"
android:gravity="center"
android:hint="请输入搜索内容(长按搜索按钮可隐藏)" />
<Button
android:id="@+id/bt_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.5"
android:text="点击搜索" />
</LinearLayout>
<LinearLayout
android:id="@+id/llweixing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:alpha="0.5" >
<Button
android:id="@+id/bt_putong"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="普通地图" />
<Button
android:id="@+id/bt_weixing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="卫星地图" />
<Button
android:id="@+id/bt_jiaotong"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="交通地图" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_suofang"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerInParent="true"
android:layout_marginRight="5dp"
android:orientation="vertical" >
<ImageButton
android:id="@+id/ib_da"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="0.5"
android:src="@drawable/da" />
<ImageButton
android:id="@+id/ib_xiao"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:alpha="0.5"
android:src="@drawable/xiao" />
</LinearLayout>
</RelativeLayout>
activity_popuwindows xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:gravity="center"
android:id="@+id/tv_popuowindow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="气泡" />
</RelativeLayout>
activity_dialogpic xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:textColor="#EE6AA7"
android:id="@+id/tv_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
效果图
点击下载源码下载
没有积分的可以到github下载:AS版本源码 Eclipse版本源码