Surface.java
public void setPosition(int x, int y) {
nativeSetPosition((float)x, (float)y);
}
/** @hide */
public void setSize(int w, int h) {
nativeSetSize(w, h);
}
public Canvas lockCanvas(Rect dirty)
throws OutOfResourcesException, IllegalArgumentException {
return nativeLockCanvas(dirty);
}
public void unlockCanvasAndPost(Canvas canvas) {
nativeUnlockCanvasAndPost(canvas);
}
android_view_Surface.cpp
static void nativeSetPosition(JNIEnv* env, jobject surfaceObj, jfloat x, jfloat y) {
sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
if (surface == NULL) return;
status_t err = surface->setPosition(x, y);
if (err < 0 && err != NO_INIT) {
doThrowIAE(env);
}
}
static void nativeSetSize(JNIEnv* env, jobject surfaceObj, jint w, jint h) {
sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj));
if (surface == NULL) return;
status_t err = surface->setSize(w, h);
if (err < 0 && err != NO_INIT) {
doThrowIAE(env);
}
}
framework/native/libs/gui/Surface.cpp
status_t SurfaceControl::setPosition(int32_t x, int32_t y) {
status_t err = validate();
if (err < 0) return err;
const sp<SurfaceComposerClient>& client(mClient);
return client->setPosition(mToken, x, y);
}
status_t SurfaceControl::setSize(uint32_t w, uint32_t h) {
status_t err = validate();
if (err < 0) return err;
const sp<SurfaceComposerClient>& client(mClient);
return client->setSize(mToken, w, h);
}
SurfaceComposerClient.cpp
status_t Composer::setPosition(const sp<SurfaceComposerClient>& client,
SurfaceID id, float x, float y) {
Mutex::Autolock _l(mLock);
layer_state_t* s = getLayerStateLocked(client, id);
if (!s)
return BAD_INDEX;
s->what |= layer_state_t::ePositionChanged;
s->x = x;
s->y = y;
return NO_ERROR;
}
status_t Composer::setSize(const sp<SurfaceComposerClient>& client,
SurfaceID id, uint32_t w, uint32_t h) {
Mutex::Autolock _l(mLock);
layer_state_t* s = getLayerStateLocked(client, id);
if (!s)
return BAD_INDEX;
s->what |= layer_state_t::eSizeChanged;
s->w = w;
s->h = h;
// Resizing a surface makes the transaction synchronous.
mForceSynchronous = true;
return NO_ERROR;
}
2)Surface修改size,location需要被如下函数包含,即close后才能生效。
Surface.openTransaction();
Surface.closeTransaction();