MapControlDemo.java
通过MapController设置缩放、旋转、俯视角度private void perfomZoom(){
EditText t = (EditText) findViewById(R.id.zoomlevel);
try{
float zoomLevel = Float.parseFloat(t.getText().toString());
mMapController.setZoom(zoomLevel);
}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());
mMapController.setRotation(rotateAngle);
}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());
mMapController.setOverlooking(overlookAngle);
}catch(NumberFormatException e){
Toast.makeText(this,
"请输入正确的俯角", Toast.LENGTH_SHORT)
.show();
}
}
调用mapview.getCurrentMap()截图@Override
public void onGetCurrentMap(Bitmap b) {
/**
* 当调用过 mMapView.getCurrentMap()后,此回调会被触发
* 可在此保存截图至存储设备
*/
File file = new File("/mnt/sdcard/test.png");
FileOutputStream out;
try{
out = new FileOutputStream(file);
if(b.compress(Bitmap.CompressFormat.PNG, 70, 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();
}
}前面说过,只要调用mMapView.getCurrentMap() 就可触发MKMapViewListener的上述方法。
监听手势所在的屏幕坐标转换为经纬度listener = new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
/**
* Projection 用于将屏幕坐标转换为地理位置坐标
*/
int x = (int)arg1.getX();
int y = (int)arg1.getY();
currentPt = mMapView.getProjection().fromPixels(x , y);
updateMapState();
/**
* 传递点击事件给MapView,sdk会自己处理缩放,平移等手势操作
*/
return false;
}
};
mMapView.setOnTouchListener(listener);MapView调用getProjection返回的自然是Projection对象,Projection有3个方法:
1 GeoPoint fromPixels(int x, int y) 根据屏幕像素坐标返回GeoPoint对象。
2 Point toPixels(GeoPoint in, Point out)把给定的GeoPoint变换到当前MapView的屏幕像素坐标,Point out 是一个预先输入的对象,如 果为空,将返回一个新分配的像素点。(其实我对out的理解有些模糊,api里说的很不明确。不知道它的作用明确是什么,它与in的关系是什 么,与返回的Point对象有什么关系,在使用这个方法的时候是不是out的值默认为null)。根据我自己的代码的测试,out的值与输出数据并 无直接关系。可以在上述代码中添加以下代码验证我的结论:
Point point1 = new Point(200,900);
Point point= mMapView.getProjection().toPixels(p, point1);
Point point= mMapView.getProjection().toPixels(p, null);
System.out.println("point:"+point.x+","+point.y);
3 float metersToEquatorPixels(float meters)。该方法把以米为计量单位的距离(沿赤道)在当前缩放水平下转换到一个以像素(水平)为计量单位的距离。 在默认的Mercator投影变换下,对于给定的距离,当远离赤道时,变换后确切的像素数量会增加。 参数: meters - 以米为单位的距离 返回: 相对给定距离的像素数量。在当前的缩放水平,如果沿赤道测量,返回值可能是个近似值