在 Android 中旋转 MapView [英] Rotate MapView in Android
问题描述
我正在编写一个 Android 应用程序,其中一个功能是地图将根据指南针旋转(即,如果手机指向东方,则地图的方向将使得地图的东侧位于顶部).我发现的以前的答案建议在 mapView 中编写 onDraw() 方法,但是,api 将该方法更改为 final,因此它不能被覆盖.因此,我试图像这样覆盖 dispatchDraw()
方法:
I am writing an Android app where one of the features is that the map will rotate according to the compass (i.e. if the phone is pointing east, the map will be oriented so that the east side of the map is on top). Previous answers that I have found suggested over writing the onDraw() method in mapView, however, the api changed the method to final so it cannot be overwritten. As a result I have tried to overwrite the dispatchDraw()
method like so:
注意:
-compass 是一个布尔值,如果为真,则旋转视图
-compass is a boolean that if true, rotate the view
-bearing 是一个浮点变量,具有视图应该旋转的度数
-bearing is a float variable that has the degrees that the view should rotate
protected void dispatchDraw(Canvas canvas) {
canvas.save();
if (compass) {
final float w = this.getWidth();
final float h = this.getHeight();
final float scaleFactor = (float)(Math.sqrt(h * h + w * w) / Math.min(w, h));
final float centerX = w / 2.0f;
final float centerY = h / 2.0f;
canvas.rotate(bearing, centerX, centerY);
canvas.scale(scaleFactor, scaleFactor, centerX, centerY);
}
super.dispatchDraw(canvas);
canvas.restore();
}
推荐答案
感谢 pheelicks 和 Nikita Koksharov 的回答,我设法根据指南针打开/关闭地图视图的旋转.
Thanks to pheelicks and Nikita Koksharov answers, I manage to turn on/off the rotation of a mapview according to the compass.
首先,您需要 MapViewCompassDemo.java 的 两个内部 类,位于:Android_SDK_ Toolsadd-onsaddon-google_apis-google-#samplesMapsDemosrccomexampleandroidapisview
First you will need the two inner class of MapViewCompassDemo.java found at: Android_SDK_ Toolsadd-onsaddon-google_apis-google-#samplesMapsDemosrccomexampleandroidapisview
RotateView
SmoothCanvas
将内部类 RotateView 提取到 RotateView.java 并添加 SmoothCanvas 作为 RotateView.java 的内部类而不是 MapViewCompassDemo.java
Extract the inner class RotateView to RotateView.java and add SmoothCanvas as a inner class of RotateView.java instead of MapViewCompassDemo.java
public class RotateView extends ViewGroup implements SensorListener {
...
static final class SmoothCanvas extends Canvas {
...
}//end SmoothCanvas
}//end RotateView
maplayout.xml :
maplayout.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map_layout_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/rotating_view"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.google.android.maps.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:apiKey="##### YOUR MAP KEY HERE ######"
android:clickable="true" />
</LinearLayout>
<ToggleButton
android:id="@+id/button_compass"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:onClick="onClick"
android:textOff="compass off"
android:textOn="compass on" />
</RelativeLayout>
地图活动
/**
* Example activity on how to display a google map view rotation with compass
* To make it work you need to add:
* - <uses-library android:name="com.google.android.maps" /> in the manifest.xml file
* - Your Android Maps API Key from https://developers.google.com/android/maps-api- signup
* - Set the project build target to "Google APIs"
* - Extract/Add the two inner classes RotateView and SmoothCanvas of MapViewCompassDemo.java found at:
* ..AndroidAndroid SDK Toolsadd-onsaddon-google_apis-google-#samplesMapsDemosrccomexampleandroidapisview
*
* @author hsigmond - touchboarder.com -
*
*/
public class MapViewRotationWithCompass extends MapActivity {
private MapView mMapView;
private MyLocationOverlay mMyLocationOverlay = null;
private boolean mModeCompass = false;
private SensorManager mSensorManager;
private LinearLayout mRotateViewContainer;
private RotateView mRotateView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maplayout);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mRotateViewContainer = (LinearLayout) findViewById(R.id.rotating_view);
mRotateView = new RotateView(this);
// Sign Up for the Android Maps API at:
// https://developers.google.com/android/maps-api-signup
// Add the Android Maps API key to the MapView in the maplayout.xml file
mMapView = (MapView) findViewById(R.id.map_view);
mMyLocationOverlay = new MyLocationOverlay(this, mMapView);
}
@SuppressWarnings("deprecation")
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_compass:
if (mMyLocationOverlay.isCompassEnabled()) {
mSensorManager.unregisterListener(mRotateView);
mRotateView.removeAllViews();
mRotateViewContainer.removeAllViews();
mRotateViewContainer.addView(mMapView);
mMyLocationOverlay.disableCompass();
mModeCompass = false;
} else {
mRotateViewContainer.removeAllViews();
mRotateView.removeAllViews();
mRotateView.addView(mMapView);
mRotateViewContainer.addView(mRotateView);
mMapView.setClickable(true);
mSensorManager.registerListener(mRotateView,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_UI);
mMyLocationOverlay.enableCompass();
mModeCompass = true;
}
break;
}
}
@SuppressWarnings("deprecation")
@Override
public void onResume() {
super.onResume();
if (mModeCompass) {
mMyLocationOverlay.enableCompass();
mSensorManager.registerListener(mRotateView,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_UI);
}
}
@Override
public void onPause() {
super.onPause();
mMyLocationOverlay.disableCompass();
}
@SuppressWarnings("deprecation")
@Override
protected void onStop() {
mSensorManager.unregisterListener(mRotateView);
super.onStop();
}
@Override
protected boolean isRouteDisplayed() {
return (false);// Don't display a route
}
}
更新:使用指南针旋转 Google MapView 示例项目:https://www.dropbox.com/sh/c1encbc2lr63qd9/6C1C4hsrlT
Update: Rotating Google MapView with Compass Example Project: https://www.dropbox.com/sh/c1encbc2lr63qd9/6C1C4hsrlT
这篇关于在 Android 中旋转 MapView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!