Android支持多個屏幕:主顯,外顯,和虛顯,虛顯就是我們要說的VirtualDisplay。VirtualDisplay的使用場景很多,比如錄屏,WFD顯示等。其作用就是抓取屏幕上顯示的內容。VirtualDisplay抓取屏幕內容,其實現方式有很多。在API中就提供了ImageReader進行讀取VirtualDisplay裏的內容。
而錄屏是通過加載SurfaceFlinger畫布,通過加載中形成的虛顯而形成的,所以我們需要在畫布虛顯中懸浮窗的view圖層去掉,首先,需要清楚你懸浮窗的view被定義的名字,比方說我定義懸浮窗的view名字爲"floatball",那麼我就可以這樣修改:
frameworks/native / services/surfaceflinger/SurfaceFlinger.cpp
void SurfaceFlinger::rebuildLayerStacks() {
ATRACE_CALL();
ALOGV("rebuildLayerStacks");
// rebuild the visible layer list per screen
if (CC_UNLIKELY(mVisibleRegionsDirty)) {
ATRACE_NAME("rebuildLayerStacks VR Dirty");
......
mDrawingState.traverseInZOrder([&](Layer* layer) {
bool hwcLayerDestroyed = false;
if (layer->belongsToDisplay(displayDevice->getLayerStack(),
displayDevice->isPrimary())) {
Region drawRegion(tr.transform(
layer->visibleNonTransparentRegion));
drawRegion.andSelf(bounds);
// ------------start-------------
if (!drawRegion.isEmpty()) {
//我們在這裏判斷是否使用虛顯錄屏,並將floatball不加入錄屏中
if (DisplayDevice::DISPLAY_VIRTUAL == displayDevice->getDisplayType()) {
if (!strstr(layer->getName().string(), "floatball")) {
layersSortedByZ.add(layer);
}
} else {
layersSortedByZ.add(layer);
}
//-------------end---------------
} else {
// Clear out the HWC layer if this layer was
// previously visible, but no longer is
hwcLayerDestroyed = layer->destroyHwcLayer(
displayDevice->getHwcDisplayId());
}
} else {
......
}
這樣在我們錄屏的時候就可以不將懸浮窗不錄入進去了
參考文章:
https://blog.csdn.net/chaojiangluo/article/details/83008865