android 开发 百度地图 最新指定区域截图

package baidumapsdk.demo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMapDoubleClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMapLongClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
import com.baidu.mapapi.map.BaiduMap.OnMapTouchListener;
import com.baidu.mapapi.map.BaiduMap.SnapshotReadyCallback;
import com.baidu.mapapi.map.MapPoi;
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.model.LatLng;

/**
 * 演示地图缩放,旋转,视角控制
 */
public class MapControlDemo extends Activity {

	/**
	 * MapView 是地图主控件
	 */
	private MapView mMapView;
	private BaiduMap mBaiduMap;

	/**
	 * 当前地点击点
	 */
	private LatLng currentPt;
	/**
	 * 控制按钮
	 */
	private Button zoomButton;
	private Button rotateButton;
	private Button overlookButton;
	private Button saveScreenButton;

	private String touchType;

	/**
	 * 用于显示地图状态的面板
	 */
	private TextView mStateBar;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_mapcontrol);
		mMapView = (MapView) findViewById(R.id.bmapView);
		mBaiduMap = mMapView.getMap();
		mStateBar = (TextView) findViewById(R.id.state);
		initListener();
	}

	private void initListener() {
		// 用户触摸地图时回调接口
		mBaiduMap.setOnMapTouchListener(new OnMapTouchListener() {

			@Override
			public void onTouch(MotionEvent event) {
			}
		});
		// 地图单击事件监听接口
		mBaiduMap.setOnMapClickListener(new OnMapClickListener() {
			// 地图单击事件回调函数
			public void onMapClick(LatLng point) {
				touchType = "单击";
				currentPt = point;
				updateMapState();
			}

			// 地图内 Poi 单击事件回调函数
			public boolean onMapPoiClick(MapPoi poi) {
				return false;
			}
		});
		// 地图长按事件监听回调函数
		mBaiduMap.setOnMapLongClickListener(new OnMapLongClickListener() {
			public void onMapLongClick(LatLng point) {
				touchType = "长按";
				currentPt = point;
				updateMapState();
			}
		});
		// 地图双击事件监听接口
		mBaiduMap.setOnMapDoubleClickListener(new OnMapDoubleClickListener() {
			public void onMapDoubleClick(LatLng point) {
				touchType = "双击";
				currentPt = point;
				updateMapState();
			}
		});
		// 地图状态改变相关接口
		mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
			public void onMapStatusChangeStart(MapStatus status) {
				updateMapState();
			}

			public void onMapStatusChangeFinish(MapStatus status) {
				updateMapState();
			}

			public void onMapStatusChange(MapStatus status) {
				updateMapState();
			}
		});

		zoomButton = (Button) findViewById(R.id.zoombutton);
		rotateButton = (Button) findViewById(R.id.rotatebutton);
		overlookButton = (Button) findViewById(R.id.overlookbutton);
		saveScreenButton = (Button) findViewById(R.id.savescreen);
		OnClickListener onClickListener = new OnClickListener() {
			@Override
			public void onClick(View view) {
				if (view.equals(zoomButton)) {
					perfomZoom();
				} else if (view.equals(rotateButton)) {
					perfomRotate();
				} else if (view.equals(overlookButton)) {
					perfomOverlook();
				} else if (view.equals(saveScreenButton)) {
					/**
					 * snapshot(BaiduMap.SnapshotReadyCallback callback) 发起截图请求
					 * void snapshotScope(Rect rect,
					 * BaiduMap.SnapshotReadyCallback callback) 发起区域截图请求<br>
					 * 注: Rect为null,截全屏
					 */
					// 截图,在SnapshotReadyCallback中保存图片到 sd 卡
					// mBaiduMap.snapshot(new SnapshotReadyCallback() {
					// public void onSnapshotReady(Bitmap snapshot) {
					// File file = new File("/mnt/sdcard/test.png");
					// FileOutputStream out;
					// try {
					// out = new FileOutputStream(file);
					// if (snapshot.compress(Bitmap.CompressFormat.PNG, 100,
					// out)) {
					// out.flush();
					// out.close();
					// }
					// Toast.makeText(MapControlDemo.this, "屏幕截图成功,图片存在: " +
					// file.toString(),
					// Toast.LENGTH_SHORT).show();
					// } catch (FileNotFoundException e) {
					// e.printStackTrace();
					// } catch (IOException e) {
					// e.printStackTrace();
					// }
					// }
					// });

					// 指定区域截图
					Rect rect = new Rect(0, 0, 300, 300);// 左xy 右xy
					mBaiduMap.snapshotScope(rect, new SnapshotReadyCallback() {

						@Override
						public void onSnapshotReady(Bitmap snapshot) {
							File file = new File("/mnt/sdcard/testall300.png");
							FileOutputStream out;
							try {
								out = new FileOutputStream(file);
								if (snapshot.compress(Bitmap.CompressFormat.PNG, 100, out)) {
									out.flush();
									out.close();
								}
								Toast.makeText(MapControlDemo.this, "屏幕截图成功,图片存在: " + file.toString(),
										Toast.LENGTH_SHORT).show();
							} catch (FileNotFoundException e) {
								e.printStackTrace();
							} catch (IOException e) {
								e.printStackTrace();
							}
						}

					});
					Toast.makeText(MapControlDemo.this, "正在截取屏幕图片...", Toast.LENGTH_SHORT).show();
				}
				updateMapState();
			}

		};
		zoomButton.setOnClickListener(onClickListener);
		rotateButton.setOnClickListener(onClickListener);
		overlookButton.setOnClickListener(onClickListener);
		saveScreenButton.setOnClickListener(onClickListener);
	}

	/**
	 * 处理缩放 sdk 缩放级别范围: [3.0,19.0]
	 */
	private void perfomZoom() {
		EditText t = (EditText) findViewById(R.id.zoomlevel);
		try {
			float zoomLevel = Float.parseFloat(t.getText().toString());
			MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(zoomLevel);
			mBaiduMap.animateMapStatus(u);
		} catch (NumberFormatException e) {
			Toast.makeText(this, "请输入正确的缩放级别", Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 处理旋转 旋转角范围: -180 ~ 180 , 单位:度 逆时针旋转
	 */
	private void perfomRotate() {
		EditText t = (EditText) findViewById(R.id.rotateangle);
		try {
			int rotateAngle = Integer.parseInt(t.getText().toString());
			MapStatus ms = new MapStatus.Builder(mBaiduMap.getMapStatus()).rotate(rotateAngle).build();
			MapStatusUpdate u = MapStatusUpdateFactory.newMapStatus(ms);
			mBaiduMap.animateMapStatus(u);
		} catch (NumberFormatException e) {
			Toast.makeText(this, "请输入正确的旋转角度", Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 处理俯视 俯角范围: -45 ~ 0 , 单位: 度
	 */
	private void perfomOverlook() {
		EditText t = (EditText) findViewById(R.id.overlookangle);
		try {
			int overlookAngle = Integer.parseInt(t.getText().toString());
			MapStatus ms = new MapStatus.Builder(mBaiduMap.getMapStatus()).overlook(overlookAngle).build();
			MapStatusUpdate u = MapStatusUpdateFactory.newMapStatus(ms);
			mBaiduMap.animateMapStatus(u);
		} catch (NumberFormatException e) {
			Toast.makeText(this, "请输入正确的俯角", Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 更新地图状态显示面板
	 */
	private void updateMapState() {
		if (mStateBar == null) {
			return;
		}
		String state = "";
		if (currentPt == null) {
			state = "点击、长按、双击地图以获取经纬度和地图状态";
		} else {
			state = String.format(touchType + ",当前经度: %f 当前纬度:%f", currentPt.longitude, currentPt.latitude);
		}
		state += "\n";
		MapStatus ms = mBaiduMap.getMapStatus();
		state += String.format("zoom=%.1f rotate=%d overlook=%d", ms.zoom, (int) ms.rotate, (int) ms.overlook);
		mStateBar.setText(state);
	}

	@Override
	protected void onPause() {
		// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
		mMapView.onPause();
		super.onPause();
	}

	@Override
	protected void onResume() {
		// MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
		mMapView.onResume();
		super.onResume();
	}

	@Override
	protected void onDestroy() {
		// MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
		mMapView.onDestroy();
		super.onDestroy();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值