我首先Rect mRect = new Rect(0,0,47,65);
然后Canvas mCanvas = holder.lockCanvas(mRect);
我通过debug发现,当执行完lockCanvas后,mRect的left、top、right、bottom值变成了0,0,320,480。
各位大虾们,求解释

解决方案 »

  1.   

    lock的是整个view的大小,也就是说,你view里ondraw来用canvas绘制,那这个canvas对应的lock就是整个view。
      

  2.   

    我调用的是SurfaceHolder的lockCanvas(Rect dirty)方法啊,
    这个方法的作用是取得一块区域对应的Canvas控制权。难道不对?
      

  3.   

    SurfaceHolder, lockCanvas后就是获得canvas的大小并锁定canvas,不让别人在上面胡搞了。canvas就是surface的大小,大部分情况下和手机分辨率是一样大的。mRect的值是正确的呀,就是你要获取的canvas的位置和大小啊。
      

  4.   

    他lock的应该是Rect的大小啊,怎么会变成屏幕大小了?
      

  5.   

    这个方法中的rect不是参数,是做返回值用的
      

  6.   

    返回值?返回值不是一个Canvas么?
      

  7.   

    这是真正调用的lockcanvas函数,你看是不是作为返回的?java的参数都是引用,凡是引用的,都是可以当做[out]熟悉,也就是当返回值带回的。
    函数返回值只能返回一个,如果要返回多个,就得靠指针或引用。
    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;
    }
      

  8.   

    楼主http://blog.csdn.net/xiaominghimi/archive/2010/12/21/6090575.aspx希望对你有帮助
      

  9.   

    那你要恶补下编程知识了 :)在此之前,只要知道,这里
    holder.lockCanvas(mRect);调用这个函数之后,mRect会被更改,改掉后的值,是真正的dirty区域 (因为多个layer覆盖的问题,你的dirty不见得就是系统要的dirty)
      

  10.   

    最近遇到的问题是锁定后返回的canvas是空的 为什么啥呢