2011-02-14 109 views
5

我想填充畫布上矩形外部的區域。我用在矩形外部填充畫布

canvas.drawRect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y, paint); 

來繪製矩形,但不能弄清楚如何填充矩形/剪輯外。

感謝 傑夫

回答

6

你不會填補剪輯之外;那就是那種夾子可以防止的事情!如果你想填充矩形外繪圖層範圍內的空間,構建四個輔助rects:

Rect above = new Rect(0, 0, canvas.getWidth(), pTopLeft.y); 
Rect left = new Rect(0, pTopLeft.y, pTopLeft.x, pBotRight.y); 
Rect right = new Rect(pBotRight.x, pTopLeft.y, canvas.getWidth(), pBotRight.y); 
Rect bottom = new Rect(0, pBotRight.y, canvas.getWidth(), canvas.getHeight()); 

然後填寫這些。

+0

感謝泰德。我玩弄了整個畫布,然後試圖讓剪輯區域透明 - 沒有什麼好處。你的方法取得了訣竅。 – Geoff 2011-02-17 20:03:42

+3

我知道你現在正在工作,但另一種可能性發生在我身上:設置一個剪輯區域,排除中間和填充。我認爲如果你使用`canvas.clipRect(innerRect,Region.Op.DIFFERENCE)`,它會打你想要的洞。 – 2011-02-18 03:34:15

0

你不能在Canvas之外畫;該區域屬於父母View。你是否有能力繼承父母View,並在你的課堂上進行繪畫?

如果你想在Canvas夾以外的畫,那麼你就必須invalidate()你感興趣的領域

15

感謝泰德和trojanfoe - 我想出了最巧妙的解決方法是

Point pTopLeft = new Point(); 
    Point pBotRight = new Point(); 

    //TODO:set x,y for points 

    Rect rHole = new Rect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y); 
    //assume current clip is full canvas 
    //put a hole in the current clip 
    canvas.clipRect(rHole, Region.Op.DIFFERENCE); 
    //fill with semi-transparent red 
    canvas.drawARGB(50, 255, 0, 0); 
    //restore full canvas clip for any subsequent operations 
    canvas.clipRect(new Rect(0, 0, canvas.getWidth(), canvas.getHeight()) 
        , Region.Op.REPLACE); 
1

ICS及以上...

canvas.clipRect(rHole, Region.Op.DIFFERENCE); 

異,差異與ReverseDifference如果啓用了硬件加速,剪輯模式爲 將被ICS忽略。

在你看來只是禁用2D硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,NULL);

參考Android: Howto use clipRect in API15