路径: AOSP/android-8.1.0_r1/frameworks/native/services/surfaceflinger/tests/resize
mk文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
SurfaceTest.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libui \
libgui \
libbinder
LOCAL_MODULE:= SurfaceTest
LOCAL_MODULE_TAGS := tests
include $(BUILD_EXECUTABLE)
cpp代码
#include <cutils/memory.h>
#include <utils/Log.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <android/native_window.h>
using namespace android;
int main(int argc, char** argv)
{
// set up the thread-pool
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create a client to surfaceflinger
sp<SurfaceComposerClient> client = new SurfaceComposerClient();
sp<SurfaceControl> surfaceControl = client->createSurface(String8("resize"),
160, 240, PIXEL_FORMAT_RGB_565, 0);
sp<Surface> surface = surfaceControl->getSurface();
SurfaceComposerClient::openGlobalTransaction();
surfaceControl->setLayer(100000);
SurfaceComposerClient::closeGlobalTransaction();
ANativeWindow_Buffer outBuffer;
surface->lock(&outBuffer, NULL);
ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
android_memset16((uint16_t*)outBuffer.bits, 0xF800, bpr*outBuffer.height);
surface->unlockAndPost();
surface->lock(&outBuffer, NULL);
android_memset16((uint16_t*)outBuffer.bits, 0x07E0, bpr*outBuffer.height);
surface->unlockAndPost();
SurfaceComposerClient::openGlobalTransaction();
surfaceControl->setSize(320, 240);
SurfaceComposerClient::closeGlobalTransaction();
IPCThreadState::self()->joinThreadPool();
return 0;
}

本文展示了如何使用Android的SurfaceComposerClient和SurfaceControl进行屏幕尺寸的动态调整。通过创建Surface,设置其层级和大小,然后进行锁屏和解锁操作,实现了屏幕从160x240到320x240的平滑变换。这段代码可作为理解SurfaceFlinger服务和图形缓冲区管理的基础测试示例。
2186

被折叠的 条评论
为什么被折叠?



