Заполнить холст за пределами прямоугольника - PullRequest
7 голосов
/ 15 февраля 2011

Я хочу заполнить область вне прямоугольника на холсте. Я использую

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

, чтобы нарисовать прямоугольник, но не могу понять, как заполнить за пределами прямоугольника / клипа.

Спасибо Geoff

Ответы [ 4 ]

17 голосов
/ 20 февраля 2011

Спасибо, Тед и Троянфо - самое лучшее решение, которое я придумала, это

    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);
6 голосов
/ 15 февраля 2011

Вы не собираетесь заполнять вне клипа; это клип, который нужно предотвратить! Если вы хотите заполнить пространство за пределами прямоугольника и внутри границ слоя чертежа, создайте четыре вспомогательные линии:

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());

Затем заполните их.

1 голос
/ 24 января 2014

ICS и выше ...

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

Режимы клипа XOR, Difference и ReverseDifference игнорируются ICS, если включено аппаратное ускорение.

Просто отключите аппаратное ускорение 2D вваше представление:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Ссылка Android: как использовать clipRect в API15

0 голосов
/ 15 февраля 2011

Вы не можете рисовать за пределами Canvas; эта область принадлежит родителю View. У вас есть возможность подклассить родителя View и вместо этого рисовать в этом классе?

Если вы хотите нарисовать вне клипа Canvas, вам придется invalidate() интересующих вас областей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...