Google Maps переход - PullRequest
       6

Google Maps переход

0 голосов
/ 26 июня 2018

У меня есть действие, в котором есть небольшая панель с картой Google, представляющей интерес.

Теперь я хочу, чтобы, когда пользователь нажимает на панель, она расширяется в полноэкранную карту (с панелью действий), чтобы иметь возможность работать с ней.

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Для Android 5.0 (уровень API 21) и выше вы можете сделать это через Общий переход элемента . Например, как в этом учебном пособии, вы можете использовать MapView для совместного использования в двух видах деятельности (например, MainActivity - где MapView на маленькой панели, а MapActivity - где MapView занимает полный экран)

  1. Включить переходы содержимого окна: добавьте <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>
    

  2. Назначьте общее имя перехода, например, "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>
  1. Запустите 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();
    }
}

Результат:

MapView transition

Кроме того, вы можете настроить анимацию перехода (сделать ее более плавной и т. Д.)

0 голосов
/ 26 июня 2018

Вы можете поместить макет gmap в FrameLayout, а также добавить к нему прозрачный вид, установить onClick в прозрачный вид и обрабатывать полноэкранный режим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...