以下演示显示纯色背景。
#include <chrono>
#include <thread>
#include <ui/DisplayConfig.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <gui/IRegionSamplingListener.h>
#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SurfaceControl.h>
#include <gui/Surface.h>
#include <private/gui/ComposerService.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <android/native_window.h>
#include <utils/Trace.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <semaphore.h>
#include <thread>
#include <iostream>
#include <stdint.h>
#include <sys/types.h>
typedef uint8_t u8;
using namespace std;
using namespace android;
using Transaction = SurfaceComposerClient::Transaction;
void asTransaction(const std::function<void(Transaction&)> &exec) {
Transaction t;
exec(t);
t.apply(true);
}
// Fill an RGBA_8888 formatted surface with a single color.
static void fillSurfaceRGBA8(const sp<SurfaceControl> &sc, u8 r, u8 g, u8 b,
bool unlock = true) {
ANativeWindow_Buffer outBuffer;
sp<Surface> s = sc->getSurface();
s->lock(&outBuffer, nullptr);
u8 *img = reinterpret_cast<u8*>(outBuffer.bits);
for (int y = 0; y < outBuffer.height; y++) {
for (int x = 0; x < outBuffer.width; x++) {
u8 *pixel = img + (4 * (y * outBuffer.stride + x));
pixel[0] = r;
pixel[1] = g;
pixel[2] = b;
pixel[3] = 255;
}
}
if (unlock) {
s->unlockAndPost();
}
}
int main(int, const char**) {
ProcessState::self()->startThreadPool();
sp<SurfaceComposerClient> mClient = new SurfaceComposerClient;
sp<SurfaceControl> mBGSurfaceControl;
mClient->initCheck();
const auto display = SurfaceComposerClient::getInternalDisplayToken();
DisplayConfig config;
SurfaceComposerClient::getActiveDisplayConfig(display, &config);
printf("refreshRate %f\n", config.refreshRate);
const ui::Size &resolution = config.resolution;
mBGSurfaceControl = mClient->createSurface(String8("11"), resolution.width,
resolution.height, PIXEL_FORMAT_RGBA_8888, 0, nullptr,
LayerMetadata(), nullptr);
fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 255);
IPCThreadState::self()->joinThreadPool();
return 0;
}