例子是仿照柯元旦的《Android内核剖析》中示例。
在external下新建文件夹MySurface, 里面编写两个文件,一个Android.mk,一个Welcome.cpp
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
Welcome.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libui \
libsurfaceflinger_client \
libskia
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/../../include/ui \
$(LOCAL_PATH)/../../include/utils \
external/skia/include/core \
external/skia/include/utils
LOCAL_MODULE:= hellosurface
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
#include <stdlib.h>
#include <stdio.h>
#include <surfaceflinger/SurfaceComposerClient.h>
#include <surfaceflinger/Surface.h>
#include <surfaceflinger/ISurfaceComposer.h>
#include <SkCanvas.h>
#include <SkBitmap.h>
#include <SkRegion.h>
using namespace android;
int main(int argc,char** argv)
{
int pid=getpid();
int x=176,y=144;
sp<SurfaceComposerClient> videoClient=new SurfaceComposerClient;
sp<SurfaceControl> spSurCtrl=videoClient->createSurface(pid,0,x,y,PIXEL_FORMAT_RGBA_8888,0);
// sp<SurfaceControl> spSurCtrl=videoClient->createSurface(0,x,y,PIXEL_FORMAT_RGBA_8888,0);
SurfaceControl* surContrl=spSurCtrl.get();
const sp<Surface>& sur=surContrl->getSurface();
videoClient->openTransaction();
surContrl->setSize(x,y);
surContrl->setPosition(10,10);
surContrl->setLayer(100000);
videoClient->closeTransaction();
surContrl->show();
SkBitmap *pmap=new SkBitmap();
//pmap->setConfig(SkBitmap::KARGB_8888_Config,x,y);
SkBitmap::Config enum_val=SkBitmap::kARGB_8888_Config;
pmap->setConfig(enum_val,x,y);
Surface::SurfaceInfo info;
sur->lock(&info);
pmap->setPixels(info.bits);
sur->unlockAndPost();
SkCanvas *canvas=new SkCanvas(*pmap);
canvas->drawColor(0x80509a47,SkXfermode::kSrc_Mode);
while(1);
return 0;
}
在external/MySurface里mm,然后将生成的 out/target/product/generic/system/bin/hellosurface adb push 到/system/bin/ 下,
adb shell进入AVD,在/system/bin/中 ./hellosurface,即可看到如下的效果:
通过C++编写的绘图,在2.3源码中亲测成功。