Я переношу приложение, написанное в графической среде, которое позволяет рисовать, происходящее вне границ отсекающего прямоугольника. Любой способ сделать это в Android?
Могу ли я рисовать за пределами холста Android
Ответ 1
Чтобы рисовать за пределами границ, вам нужно развернуть clipRect холста.
Проверьте перегруженные методы clipRect в классе Canvas.
Примечание. Вам нужно будет указать операцию Region, потому что операция по умолчанию - INTERSECT. Так что-то вроде этого:
Rect newRect = canvas.getClipBounds();
newRect.inset(-5, -5) //make the rect larger
canvas.clipRect (newRect, Region.Op.REPLACE);
//happily draw outside the bound now
Ответ 2
попробуйте установить
android:clipChildren="false"
в родительский вид
Ответ 3
Вы можете рисовать, где хотите, но ничего не будет сохранено за пределами отсекающего прямоугольника.
Ответ 4
Ответ @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);
Это решает проблему: -)
Ответ 5
Если вы хотите вывести текст за пределы в TextView, вы должны сделать это вместо этого:
<TextView
...
android:shadowColor="#01000000"
android:shadowDx="100" // out of right bound
android:shadowDy="0"
android:shadowRadius="1"
.../>
Он не работает, чтобы использовать clipRect() как @numan ответ, потому что TextView закрепил его собственный rect в 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