Transaction setRelativeLayer函数的使用

#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;
	sp<SurfaceControl> relative;
	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"), 500,
			500, PIXEL_FORMAT_RGBA_8888, 0, nullptr,
			LayerMetadata(), nullptr);

	relative = mClient->createSurface(String8("11"), 200, 200,
			PIXEL_FORMAT_RGBA_8888, 0, nullptr, LayerMetadata(), nullptr);
			
	Transaction().setLayer(mBGSurfaceControl, 10).setPosition(mBGSurfaceControl, 10, 10).show(mBGSurfaceControl).apply();
	
	Transaction{}
            .setRelativeLayer(relative, mBGSurfaceControl->getHandle(), 1)
            .setPosition(relative, 10, 10)
            .apply();

	fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 255);
	fillSurfaceRGBA8(relative, 100, 100, 100);
	
    Transaction{}.show(relative).apply();
	
	sleep(2);
	 Transaction{}.hide(relative).apply();
	IPCThreadState::self()->joinThreadPool();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值