先说说我的测试机器:nexus s,操作系统:android 4.1。以下的结果都是通过nexus s上测试通过。
还是直接上代码
package com.myMap;
import java.util.ArrayList;
import java.util.List;
import android.R.drawable;
import android.R.integer;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.location.IONSetLocation;
import com.location.MyMapABCLocationListener;
import com.location.MyMapABCLocationManager;
import com.mapabc.mapapi.core.GeoPoint;
import com.mapabc.mapapi.core.OverlayItem;
import com.mapabc.mapapi.map.ItemizedOverlay;
import com.mapabc.mapapi.map.MapActivity;
import com.mapabc.mapapi.map.MapController;
import com.mapabc.mapapi.map.MapView;
import com.mapabc.mapapi.map.Overlay;
import com.mapabc.mapapi.map.Projection;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class MyMapActivity extends MapActivity implements OnClickListener{
/** Called when the activity is first created. */
private MapView mMapView;//地图VIEW
private MapController mMapController;//控制器
private List<Overlay> mOverlayList; //地图图层容器
private boolean mRegisteredSensor;
private MyMapABCLocationListener mlLocationListener;
private MyMapABCLocationManager mLocationManager;
private MyOverlay mOverlay; //我的位置图层
private Handler mHandler;
private boolean isFirstCenter=true;
private GeoPoint geoPoint;
private boolean isLocated=false;
private Button btn;
private Sensor orientSensor;
private SensorManager mSensorManager;
private SensorEventListener OrientSensorListener=new SensorEventListener(){
public void onAccuracyChanged(Sensor sensor,int accuracy){
}
public void onSensorChanged(SensorEvent event) {//从方向传感器获取手机所对的方向
// TODO Auto-generated method stub
if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){
float x=event.values[SensorManager.DATA_X];
mOverlay.setDegree((int)x);
mMapView.postInvalidate();//刷新mapview
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mRegisteredSensor=false;
mMapView = (MapView) findViewById(R.id.main_mapView);
mMapView.setBuiltInZoomControls(true); // 设置启用内置的缩放控件
mMapController = mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
mOverlayList = mMapView.getOverlays(); // 得到图层容器
mMapController.setZoom(mMapView.getMaxZoomLevel()-1);//获取地图放大级别
btn=(Button)findViewById(R.id.search);
btn.setOnClickListener(this);
mOverlay=new MyOverlay(getResources().getDrawable(R.drawable.marker3));
/////////////////////////////
mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
orientSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
////////////////////////////
mOverlayList.add(mOverlay);
initLogic();
}
@Override
public void onClick(View v){
switch(v.getId()) {
case R.id.search:
if(geoPoint!=null){
mMapController.animateTo(geoPoint);
}
}
}
private void initLogic(){
mHandler=new Handler(){
@Override
public void handleMessage(Message msg){
switch (msg.what) {
case 3:
Toast.makeText(MyMapActivity.this, "location is null", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
mLocationManager=new MyMapABCLocationManager(this);
mlLocationListener=new MyMapABCLocationListener(mHandler, new UpdateLocationRunnable());
Location location=mLocationManager.getLastKnowLocation();
if(location!=null){
mOverlay.setLocation(location);
GeoPoint focusGeoPoint = new GeoPoint((int) (location.getLatitude() * 1E6),
(int) (location.getLongitude() * 1E6));
mMapController.animateTo(focusGeoPoint);
mMapView.postInvalidate();
}//////获取上次所在位置,如果不为null显示出来
}
public void firsCenter(Location location)
{
if (location != null)
{
GeoPoint focusGeoPoint = new GeoPoint((int) (location.getLatitude() * 1E6),
(int) (location.getLongitude() * 1E6));
mMapController.animateTo(focusGeoPoint);
}
}
@Override
protected void onDestroy(){
super.onDestroy();
if(mOverlay!=null){
mOverlayList.clear();
}
mLocationManager.clear();
}
@Override//////////对于网络断开后重连,重要
protected void onPause(){
super.onPause();
mLocationManager.unRegisterListen();
if(mRegisteredSensor){
mSensorManager.unregisterListener(OrientSensorListener);
mRegisteredSensor=false;
}
}
@Override
protected void onResume(){//////////对于网络断开后重连,重要
mLocationManager.registerListener(mlLocationListener);
Toast.makeText(this, "resume", Toast.LENGTH_SHORT).show();
mRegisteredSensor=mSensorManager.registerListener(OrientSensorListener, orientSensor,SensorManager.SENSOR_DELAY_GAME);
if(!mRegisteredSensor){
Toast.makeText(getApplicationContext(), "not support orientSensor", Toast.LENGTH_LONG).show();
}
super.onResume();
}
class UpdateLocationRunnable implements IONSetLocation{
private Location location;
private String address;
private boolean mVlid;
public UpdateLocationRunnable(){
}
@Override
public void setAdress(String adress) {
// TODO Auto-generated method stub
}
@Override
public void setLocation(Location location) {
// TODO Auto-generated method stub
this.location=location;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(location!=null){
}else{
Toast.makeText(MyMapActivity.this, "Gaode -->no location...", Toast.LENGTH_SHORT).show();
}
mOverlay.setLocation(location);
if(isFirstCenter){
firsCenter(location);
}
geoPoint= new GeoPoint((int) (location.getLatitude() * 1E6),(int) (location.getLongitude() * 1E6));
mMapView.postInvalidate();//刷新地图
}
}
}/* * 我的位置图层 */class MyOverlay extends Overlay{private Location mLastLocation;private GeoPoint mLastGeoPoint;private Drawable drawable;private float degree;//图片旋转角度public MyOverlay(Drawable drawable){this.drawable=drawable;}public void setLocation(Location location){if (location != null){mLastLocation = location;mLastGeoPoint = new GeoPoint((int) (mLastLocation.getLatitude() * 1E6),(int) (mLastLocation.getLongitude() * 1E6));}}public void setDegree(float degree){this.degree=degree;}@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {super.draw(canvas, mapView, shadow);// TODO Auto-generated method stub if (mLastLocation != null){ Projection projection = mapView.getProjection(); Point screenPts = new Point(); screenPts=projection.toPixels(mLastGeoPoint, null); Paint mPaint=new Paint(); mPaint.setColor(Color.BLUE); mPaint.setAlpha(5); float radius = projection.metersToEquatorPixels(mLastLocation.getAccuracy());canvas.drawCircle(screenPts.x, screenPts.y , radius, mPaint);//以精准度为半径画圆Bitmap bitmap=((BitmapDrawable)drawable).getBitmap();//画出“我的位置”图标Matrix matrix=new Matrix();matrix.setRotate(degree,0,0);bitmap=Bitmap.createBitmap(bitmap, 0, 0,bitmap.getWidth(), bitmap.getHeight(),matrix,false); canvas.drawBitmap(bitmap, screenPts.x-bitmap.getWidth()/2-0.5f,screenPts.y-bitmap.getHeight()/2-0.5f, new Paint());} }}
.MyMapABCLocationListener和MyMapABCLocationManager是参考别人代码封转的,由于篇幅的关系不给出来了(类详见代码:TestMapABCDemo.zip 很不错的参考代码)
我想说是旋转图片的问题。经过实践,如果一个图片经过旋转后,它的中心位置会发生改变。之前我的做法是获取原图的的中心位置,但是发现后面画出来的图片会“漂”
还有的是onResume和onDestory。注销了listener之后一定要把它注册回去,不然就不会监听消息了。
附件:myMap.rar
警告:android camera系列的文章是由一个刚接触android不到一个月的菜鸟所写,所以必然存在很多错误,请大家多多指出