实现指南针代码:
package com.geoserver.osmdroid;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.View;
/**
* 自定义指南针实现
*
* @Title:
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:
* @Date:2012-8-24
* @author longgangbai
* @version 1.0
*/
public class CompassView extends View {
private Drawable mCompass;
private float mAzimuth = 0;
private boolean mSideBottom;
private int PADDING = 2;
public CompassView(Context ctx, final boolean sideBottom) {
super(ctx);
this.mCompass = ctx.getResources().getDrawable(R.drawable.arrow_n);
mSideBottom = sideBottom;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
if (mSideBottom) {
canvas.rotate(360 - mAzimuth, PADDING + mCompass.getMinimumWidth() / 2, PADDING + mCompass.getMinimumHeight() / 2);
mCompass.setBounds(PADDING, PADDING, PADDING + mCompass.getMinimumWidth(), PADDING
+ mCompass.getMinimumHeight());
} else {
canvas.rotate(360 - mAzimuth, PADDING + mCompass.getMinimumWidth() / 2, this.getHeight() - mCompass.getMinimumHeight() /2 - PADDING);
mCompass.setBounds(PADDING, this.getHeight() - mCompass.getMinimumHeight() - PADDING, PADDING
+ mCompass.getMinimumWidth(), this.getHeight() - PADDING);
}
mCompass.draw(canvas);
canvas.restore();
super.onDraw(canvas);
}
public void setAzimuth(float aAzimuth) {
mAzimuth = aAzimuth;
}
}
界面类:
package com.geoserver.osmdroid;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout;
/**
*
官网:
http://code.google.com/p/osmdroid/
功能:
基本功能有:查看地图、缩放地图、单点移动、多点触控等
* @Title:
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-7-31
* @author longgangbai
* @version 1.0
*/
public class GeoServerosmdroidActivity extends Activity {
private MapView mapView;
private CompassView compassView;
private SensorManager sensorManager;
private boolean mCompassEnabled=true;
private boolean mDrivingDirectionUp=true;
private boolean mNorthDirectionUp=true;
private boolean sideBottom=true;
private float mLastSpeed;
private RelativeLayout relationLayout;
private MapController mapController;
private final SensorEventListener mListener = new SensorEventListener() {
private int iOrientation = -1;
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
if (iOrientation < 0)
iOrientation = ((WindowManager) GeoServerosmdroidActivity.this.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getOrientation();
compassView.setAzimuth(event.values[0] + 90 * iOrientation);
compassView.invalidate();
if (mCompassEnabled)
if (mNorthDirectionUp)
if (mDrivingDirectionUp == false || mLastSpeed == 0) {
mapView.invalidate();
}
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Pass true here to actually contribute to OSM!
setContentView(R.layout.main);
sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerListener(mListener, sensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);
initCompassView();
initgeoServerMap();
}
/**
*
*/
private void initgeoServerMap() {
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
mapController.setZoom(9);
GeoPoint point2 = new GeoPoint(-99.404296875*1000000, 42.682435398386204*1000000);
mapController.setCenter(point2);
this.setRequestedOrientation(-1);
compassView.setVisibility(View.VISIBLE);
}
/**
* 鍒濆鍖栨寚鍗楅拡
*/
private void initCompassView() {
relationLayout=(RelativeLayout)findViewById(R.id.geoserver_layout);
this.mapView =(MapView)findViewById(R.id.map);
/* Compass */
compassView = new CompassView(this, sideBottom);
compassView.setVisibility(mCompassEnabled ? View.VISIBLE : View.INVISIBLE);
/* Create RelativeLayoutParams, that position in in the top right corner. */
final RelativeLayout.LayoutParams compassParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
compassParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
compassParams.addRule(!sideBottom ? RelativeLayout.ALIGN_PARENT_BOTTOM : RelativeLayout.ALIGN_PARENT_TOP);
relationLayout.addView(compassView, compassParams);
}
@Override
protected void onDestroy() {
sensorManager.unregisterListener(mListener);
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(mListener);
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(mListener, sensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);
}
}
布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:background="#FFFFFF" android:id="@+id/geoserver_layout" android:layout_height="fill_parent" > <org.osmdroid.views.MapView android:id="@+id/map" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:enabled="true" tilesource="MapquestOSM" /> </RelativeLayout>
配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geoserver.osmdroid"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity android:name="GeoServerosmdroidActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>