Для Android 5.0 (уровень API 21) и выше вы можете сделать это через Общий переход элемента . Например, как в этом учебном пособии, вы можете использовать MapView
для совместного использования в двух видах деятельности (например, MainActivity
- где MapView
на маленькой панели, а MapActivity
- где MapView
занимает полный экран)
Включить переходы содержимого окна: добавьте <item name="android:windowContentTransitions">true</item>
в ваш styles.xml
файл:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowContentTransitions">true</item>
</style>
Назначьте общее имя перехода, например, "common_map"
путем добавления параметра android:transitionName="common_map"
к обоим общим MapView
в макетах MainActivity
и MapActivity
:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="<your_package_name>.MainActivity">
<RelativeLayout
android:id="@+id/panel"
android:layout_centerVertical="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.gms.maps.MapView
android:id="@+id/mapview"
android:layout_width="100dp"
android:layout_height="100dp"
android:transitionName="common_map"
/>
<TextView
android:id="@+id/description_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@+id/mapview"
android:layout_margin="16dp"
android:text="Small panel with map"/>
</RelativeLayout>
</RelativeLayout>
activity_map.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="<your_package_name>.MapActivity">
<com.google.android.gms.maps.MapView
android:id="@+id/mapview_fullscreen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transitionName="common_map"
/>
</RelativeLayout>
Запустите MapActivity
, указав набор общих MapView
элементов, например. на «маленькой панели» (mPanelLayout
) нажмите:
mPanelLayout = (RelativeLayout) findViewById(R.id.panel);
mPanelLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MapActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(MainActivity.this, (View) mMapView, "common_map");
startActivity(intent, options.toBundle());
}
});
И это все.
NB! Вы должны переслать следующие все MapView
методы: onCreate(Bundle), onStart(), onResume(), onPause(), onStop(), onDestroy(), onSaveInstanceState(), onLowMemory()
или использовать Lite Mode и только пересылку onCreate()
.
Полный исходный код:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String MAP_VIEW_BUNDLE_KEY = "MapViewBundleKey";
static final LatLng KYIV = new LatLng(50.450311, 30.523730);
private GoogleMap mGoogleMap;
private MapView mMapView;
private RelativeLayout mPanelLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bundle mapViewBundle = null;
if (savedInstanceState != null) {
mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
}
mMapView = (MapView) findViewById(R.id.mapview);
mMapView.onCreate(mapViewBundle);
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
mGoogleMap.addMarker(new MarkerOptions()
.position(KYIV)
.title("Kyiv"));
mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
.target(KYIV)
.zoom(12)
.build()));
}
});
mPanelLayout = (RelativeLayout) findViewById(R.id.panel);
mPanelLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MapActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(MainActivity.this, (View) mMapView, "common_map");
startActivity(intent, options.toBundle());
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Bundle mapViewBundle = outState.getBundle(MAP_VIEW_BUNDLE_KEY);
if (mapViewBundle == null) {
mapViewBundle = new Bundle();
outState.putBundle(MAP_VIEW_BUNDLE_KEY, mapViewBundle);
}
mMapView.onSaveInstanceState(mapViewBundle);
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onStart() {
super.onStart();
mMapView.onStart();
}
@Override
protected void onStop() {
super.onStop();
mMapView.onStop();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mMapView.onDestroy();
super.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
}
MapActivity.java
public class MapActivity extends AppCompatActivity {
private static final String MAP_VIEW_BUNDLE_KEY = "MapViewBundleKey1";
static final LatLng KYIV = new LatLng(50.450311, 30.523730);
private MapView mMapView;
private GoogleMap mGoogleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
Bundle mapViewBundle = null;
if (savedInstanceState != null) {
mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
}
setTitle("Full screen");
mMapView = (MapView) findViewById(R.id.mapview_fullscreen);
mMapView.onCreate(mapViewBundle);
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
mGoogleMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
.target(KYIV)
.zoom(12)
.build()));
mGoogleMap.addMarker(new MarkerOptions()
.position(KYIV)
.title("Kyiv"));
}
});
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onStart() {
super.onStart();
mMapView.onStart();
}
@Override
protected void onStop() {
super.onStop();
mMapView.onStop();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mMapView.onDestroy();
super.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
}
Результат:
Кроме того, вы можете настроить анимацию перехода (сделать ее более плавной и т. Д.)