android 8 (26) View Z index работает иначе, чем ‹= 25

Я искал много дней, чтобы разобраться в этой проблеме, и, будучи немного новичком в Java, я ничего не получаю...

следующий код демонстрирует проблему. Код работает, но на самом деле не должен.

Полный код находится здесь https://github.com/martyzz1/cordova-plugin-opentok/blob/master/src/android/OpenTokAndroidPlugin.java

2 (или более, но в нашем случае 2) просмотра представляют собой двухстороннее видео, при этом просмотр подписчиком занимает всю страницу, а издатель представляет собой небольшую миниатюру с более высоким zindex, которая появляется над просмотром подписчика в правом нижнем углу. . Код отлично работал на Android ‹= 25, но на Android 8 миниатюра появляется внизу (и, следовательно, скрыта).

Я просмотрел документы об изменениях Android 8, но не нашел ничего, что могло бы объяснить разницу. например что переключение порядка списка представлений заставляет его работать. Я также могу переключать значения zindex во время выполнения и перерисовывать окна, и код ведет себя правильно. например понижение zindex издателя до значения меньше, чем сеанс, скрывает миниатюру, а увеличение показывает миниатюру.

Я пробовал использовать setZ, setElevation, BringtoFront, addView(mView, index) addView(mView, -1) И у меня просто нет идей. Кто-нибудь может помочь?

public class CustomComparator implements Comparator<RunnableUpdateViews> {
        @Override
        public int compare(RunnableUpdateViews object1, RunnableUpdateViews object2) {
            if (android.os.Build.VERSION.SDK_INT > 25) {
                return object1.getZIndex() - object2.getZIndex();
            } else {
                return object2.getZIndex() - object1.getZIndex();
            }
        }
    }
public void updateZIndices() {
        allStreamViews = new ArrayList<RunnableUpdateViews>();
        for (Map.Entry<String, RunnableSubscriber> entry : subscriberCollection.entrySet()) {
            allStreamViews.add(entry.getValue());
        }
        if (myPublisher != null) {
            allStreamViews.add(myPublisher);
        }
        Collections.sort(allStreamViews, new CustomComparator());

        int index = 1;

        ViewGroup parent = (ViewGroup) cordova.getActivity().findViewById(android.R.id.content);
        for (RunnableUpdateViews viewContainer : allStreamViews) {
            if (null != parent) {
                //viewContainer.mView.bringToFront();
                //int  zind = viewContainer.getZIndex();
                //float zindF = zind;
                //this.mView.setElevation(zindF);

                parent.removeView(viewContainer.mView);
                parent.addView(viewContainer.mView);
                //index += 1;
            } else {
                Log.i(TAG, "parent was null");
            }
        }
        /*for (int i = 0; i < allStreamViews.size(); i++) {
            allStreamViews.get(i).mView.invalidate();
        }
        parent.invalidate();*/
    }

    public int getZIndex() {
        try {
            Log.i(TAG, "getZIndex " + mProperty.getString(0));
            return mProperty.getInt(5);
        } catch (Exception e) {
            Log.i(TAG, "getZIndex() exception" + e.toString());
            return 0;
        }
    }

person Martin Moss    schedule 08.01.2018    source источник
comment
Закомментированный код показывает альтернативные решения, которые я пробовал, но ничего не работало.   -  person Martin Moss    schedule 09.01.2018
comment
возможно, это могла быть непостоянная проблема с версией, но я не смог проверить и подтвердить.... github.com/opentok/cordova-plugin-opentok/issues/   -  person Martin Moss    schedule 04.04.2018


Ответы (2)


Не уверен, что это так. Но когда мы добавили возможность загружать камеры за веб-просмотром. Мы выяснили, что на данный момент все камеры находятся в одном и том же виде и в одной позиции Z.

С использованием TranslationZ они находятся на разных уровнях. См. следующую реализацию: https://github.com/Mediapioniers/cordova-plugin-opentok/tree/feat.cams_behind_webview_z-index?files=1

person Mark Veenstra    schedule 20.02.2018

setZOrderOnTop и setZOrderMediaOverlay на самом деле единственные способы изменить порядок SurfaceView по отношению друг к другу. См. https://stackoverflow.com/a/22746240/468405 для получения дополнительной информации.

person Joel    schedule 02.04.2018