我首先Rect mRect = new Rect(0,0,47,65);
然后Canvas mCanvas = holder.lockCanvas(mRect);
我通过debug发现,当执行完lockCanvas后,mRect的left、top、right、bottom值变成了0,0,320,480。
各位大虾们,求解释
然后Canvas mCanvas = holder.lockCanvas(mRect);
我通过debug发现,当执行完lockCanvas后,mRect的left、top、right、bottom值变成了0,0,320,480。
各位大虾们,求解释
解决方案 »
- android上有PropertyUtils的替代品吗?
- Handler.sendMessage()被阻塞
- Android多媒体开发
- Android 信息提示
- gadget 划拟U盘成功,查入PC,但打开盘符时,出现请查入磁盘驱动器。这个问题如何办?
- Android 里面onTouchEvent()事件与onLongClick()事件冲突!求解决?
- 遇到一个奇怪的问题,为何配置了ID,突然在R类中,没有更新?
- 那些大神他们发的应用gif是怎么制作的呢
- andorid thread使用sleep方法遇到的问题.
- 实现出厂设置 如何跳过 设备管理器激活 这一步
- 求高手解决android调用webservice问题
- Android 让人无语的界面开发
这个方法的作用是取得一块区域对应的Canvas控制权。难道不对?
函数返回值只能返回一个,如果要返回多个,就得靠指针或引用。
static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect)
{
const sp<Surface>& surface(getSurface(env, clazz));
if (!Surface::isValid(surface))
return 0; // get dirty region
Region dirtyRegion;
if (dirtyRect) {
Rect dirty;
dirty.left = env->GetIntField(dirtyRect, ro.l);
dirty.top = env->GetIntField(dirtyRect, ro.t);
dirty.right = env->GetIntField(dirtyRect, ro.r);
dirty.bottom= env->GetIntField(dirtyRect, ro.b);
if (!dirty.isEmpty()) {
dirtyRegion.set(dirty);
}
} else {
dirtyRegion.set(Rect(0x3FFF,0x3FFF));
} Surface::SurfaceInfo info;
status_t err = surface->lock(&info, &dirtyRegion);
if (err < 0) {
const char* const exception = (err == NO_MEMORY) ?
OutOfResourcesException :
"java/lang/IllegalArgumentException";
doThrow(env, exception, NULL);
return 0;
} // Associate a SkCanvas object to this surface
jobject canvas = env->GetObjectField(clazz, so.canvas);
env->SetIntField(canvas, co.surfaceFormat, info.format); SkCanvas* nativeCanvas = (SkCanvas*)env->GetIntField(canvas, no.native_canvas);
SkBitmap bitmap;
ssize_t bpr = info.s * bytesPerPixel(info.format);
bitmap.setConfig(convertPixelFormat(info.format), info.w, info.h, bpr);
if (info.format == PIXEL_FORMAT_RGBX_8888) {
bitmap.setIsOpaque(true);
}
if (info.w > 0 && info.h > 0) {
bitmap.setPixels(info.bits);
} else {
// be safe with an empty bitmap.
bitmap.setPixels(NULL);
}
nativeCanvas->setBitmapDevice(bitmap);
SkRegion clipReg;
if (dirtyRegion.isRect()) { // very common case
const Rect& b(dirtyRegion.getBounds());
clipReg.setRect(b.left, b.top, b.right, b.bottom);
} else {
size_t count;
Rect const* r = dirtyRegion.getArray(&count);
while (count) {
clipReg.op(r->left, r->top, r->right, r->bottom, SkRegion::kUnion_Op);
r++, count--;
}
} nativeCanvas->clipRegion(clipReg);
int saveCount = nativeCanvas->save();
env->SetIntField(clazz, so.saveCount, saveCount); //// 在这,设置好返回的区域
if (dirtyRect) {
const Rect& bounds(dirtyRegion.getBounds());
env->SetIntField(dirtyRect, ro.l, bounds.left);
env->SetIntField(dirtyRect, ro.t, bounds.top);
env->SetIntField(dirtyRect, ro.r, bounds.right);
env->SetIntField(dirtyRect, ro.b, bounds.bottom);
}
return canvas;
}
holder.lockCanvas(mRect);调用这个函数之后,mRect会被更改,改掉后的值,是真正的dirty区域 (因为多个layer覆盖的问题,你的dirty不见得就是系统要的dirty)