yandex / mapkit-android-demo

MapKit Android demo
Other
120 stars 59 forks source link

Dialog и Mapview #91

Closed sergpalm closed 1 year ago

sergpalm commented 5 years ago

Делаю диалоговое окно (пробывал Dialog, AlertDialog, FragmentDialog) Сбрасываю флаг FLAG_DIM_BEHIND (иначе карта темная). Создаю MapView или беру из существующего layout.

При отрисовке карты или при скрытии диалога видно то что находится за диалоговым окном, т.е. как будто карта становится прозрачной и видно все что находится под диалоговым окном. Такая же ситуация когда mapView ставится видимость GONE или когда один фрагмент в диалоге меняется на другой. Как это можно исправить?

eberkovich commented 5 years ago

Не вполне понял описание проблемы: MapView добавляется в диалог? Не могли бы Вы описать проблему подробнее?

sergpalm commented 5 years ago

1 - создаю диалог (Dialog, AlertDialog, FragmentDialog) 2 - Выставляю R.layout.dialog + сбрасываю FLAG_DIM_BEHIND 3 - Видно окно диалога с 4 кнопками внизу image

4 - На кнопку 1 -4 ставлю слушатель 5 - Нажимаю на кнопку 1 (для показа карты) 5.1 при Dialog или AlertDialog создаю mapView в нужном l LinearLaoyout mapview = new MapView(this); l.addView(mapview);

5.2 при FragmentDialog FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); ChildFragment1 childFragment1 = new ChildFragment1(); transaction.replace(R.id.fragment_container, childFragment1); transaction.commit(); 6 - карта рисуется, но до момента рисования видно что находится за диалоговым окном 7 - карта нарисовалась. 8 - нажимаю на кнопку 2 8.1 - если Dialog или AlertDialog l.removeAllViews(); 8.2 - если DialogFragment FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); ChildFragment2 childFragment2 = new ChildFragment2(); transaction.replace(R.id.fragment_container, childFragment2); transaction.commit();

  1. Окно с картой скрывается но на 2-3 секунды видно то что находится за картой image
  2. Если просто нажимать на кнопки 2 3 4 и сркывать окно то все работает замечательно

Как поборот прозрачность блока с картой приотрисовке или при скрытии?

sergpalm commented 5 years ago

MainActivity

public void openMap(View view) {
    ContainerDialogFragment dialogFragment = new ContainerDialogFragment();

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
      ft.remove(prev);
    }
    ft.addToBackStack(null);
    dialogFragment.show(ft,"dialog");
  }

ContainerDialogFragment

FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    ChildFragment1 childFragment1 = new ChildFragment1();
    transaction.replace(R.id.fragment_container, childFragment1);
    transaction.commit();

ChildFragment1

MapKitFactory.setApiKey("*******");
    MapKitFactory.initialize(getActivity());
    View rootView = inflater.inflate(R.layout.page1, null);
    mapview = (MapView)rootView.findViewById(R.id.mapview);
    mapview.getMap().setMapLoadedListener(new MapLoadedListener() {
      @Override
      public void onMapLoaded(@NonNull MapLoadStatistics mapLoadStatistics) {
        for(int i=0;i<mapview.getChildCount();i++) {
          Log.d("fragment1", "onMapLoaded="+mapview.getChildAt(i).getClass().getSimpleName());
        }
        Log.d("fragment1", "onMapLoaded");
      }
    });
    mapview.getMap().move(
        new CameraPosition(new Point(55.751574, 37.573856), 11.0f, 0.0f, 0.0f),
        new Animation(Animation.Type.SMOOTH, 0),
        null);
    return rootView;
ToleubekRauan commented 5 years ago

Столкнулся с такой же проблемой. Создание нового Activity с Circular Reveal анимацией -> блок с картой отрисовывается моментально, как бы находится НАД всей анимацией и родителем view.

sergpalm commented 5 years ago

Ну мы победили проблему - мне бы хотелось услышать создателей яндексовых карт - как надо побеждать прозрачность карты

ToleubekRauan commented 5 years ago

@sergpalm не могли описать ваше решение, спасибо!

sergpalm commented 5 years ago
/**
   * Находим главный GLSurfaceView и делаем его z индекс - наверх (иначе на диалоге происходит мигание карты)
   */
  private void initGL() {
    GLSurfaceView platformGLView = null;
    try {
      Field f = MapView.class.getDeclaredField("platformGLView");
      f.setAccessible(true);
      if (f.get(mapview) instanceof GLSurfaceView) {
        platformGLView = (GLSurfaceView) f.get(mapview);
        platformGLView.setZOrderMediaOverlay(true);
        platformGLView.setZOrderOnTop(true);
        platformGLView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
        platformGLView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
      }
    } catch (Exception e) {
      Log.d(YandexMap.TAG, "initGL1", e);
      e.printStackTrace();
    }
    Log.d(YandexMap.TAG, "initGL3="+platformGLView );
  }
ToleubekRauan commented 5 years ago

@sergpalm спасибо, в каком месте вы вызываете метод initGL()?

sergpalm commented 5 years ago

Где карта создается

   mapview = new MapView(context);
    mapview.setLayoutParams(new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT,
        1.0f
    ));
    initGL();