我已经搜索了好几天来解决这个问题的底部,并且作为一个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;
}
}
答案 0 :(得分:0)
不确定是否是这种情况。但是当我们添加了在webview后面加载凸轮的可能性时。我们发现目前所有凸轮都位于相同的视图和相同的Z位置。
使用TranslationZ它们处于不同的层次。请参阅下一个实施:https://github.com/Mediapioniers/cordova-plugin-opentok/tree/feat.cams_behind_webview_z-index?files=1
答案 1 :(得分:0)
setZOrderOnTop
和setZOrderMediaOverlay
实际上是改变SurfaceView
s相对于彼此的顺序的唯一方法。有关详细信息,请参阅https://stackoverflow.com/a/22746240/468405。