Можно ли рисовать за пределами Android-холста - PullRequest
20 голосов
/ 27 октября 2010

Я портирую приложение, написанное в графической среде, которая позволяет рисовать за пределами прямоугольника отсечения.Есть ли способ сделать это в Android?

Ответы [ 5 ]

44 голосов
/ 19 марта 2013

Чтобы нарисовать за пределами границ, вам нужно расширить clipRect холста.

Проверьте перегруженные методы clipRect в классе Canvas.

Примечание. Вам нужно будет указать операцию «Регион», поскольку по умолчанию используется операция «ИНТЕРСЕКТ». Вот как то так:

Rect newRect = canvas.getClipBounds();
newRect.inset(-5, -5)  //make the rect larger

canvas.clipRect (newRect, Region.Op.REPLACE);
//happily draw outside the bound now
30 голосов
/ 21 ноября 2013

попробуйте установить

android:clipChildren="false" 

в родительском представлении

9 голосов
/ 27 октября 2010

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

3 голосов
/ 16 октября 2016

Ответ, который дал @numan, почти в порядке, проблема заключается в распределении памяти при таком подходе, поэтому мы должны сделать это вместо этого:

// in constructor/elsewhere
Rect newRect = new Rect();

// in onDraw
canvas.getClipBounds(newRect);
newRect.inset(0, -20);  //make the rect larger
canvas.clipRect(newRect, Region.Op.REPLACE);

Это решает проблему: -)

2 голосов
/ 14 ноября 2017

Если вы хотите рисовать текст вне границ в TextView, вы должны сделать это вместо этого:

<TextView
    ...
    android:shadowColor="#01000000"
    android:shadowDx="100" // out of right bound
    android:shadowDy="0"
    android:shadowRadius="1"
.../>

Не работает использование clipRect (), как в ответе @ numan, потому что TextView обрезает свой собственный прямоугольник вonDraw ():

if (mShadowRadius != 0) {
    clipLeft += Math.min(0, mShadowDx - mShadowRadius);
    clipRight += Math.max(0, mShadowDx + mShadowRadius);

    clipTop += Math.min(0, mShadowDy - mShadowRadius);
    clipBottom += Math.max(0, mShadowDy + mShadowRadius);
}

canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom);

И последнее, но не менее важное: не забудьте установить android:clipChildren="false" и android:clipToPadding="false" в родительской ViewGroup

...