Ответ 1
Canvas. clipRect (левый, верхний, правый, нижний) уменьшает область экрана, на которую могут записывать операции будущего рисования. Он устанавливает, что clipBounds является пространственным пересечением текущего отсекающего прямоугольника и указанного прямоугольника. Существует много вариантов метода clipRect, которые принимают разные формы для регионов и допускают различные операции над отсекающим прямоугольником. Если вы хотите явно установить область отсечения, попробуйте:
canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE);
Пятый аргумент означает замену обрезающего прямоугольника, а не создание пересечения с предыдущей версией.
Попробуйте переместить оператор clipRect перед оператором drawRect. Или попробуйте добавить:
paint.setColor(Color.YELLOW);
drawRect(0,0,75,75);
после существующего оператора clipRect. Он должен нарисовать желтый квадрат размером 50x50 над тем, что у вас было раньше.
Еще одно замечание: (после долгого разочарования по видимому, в основном недокументированным View/ViewGroup/draw code) я обнаружил, что canvas.translate(x, y) также настраивает clipRect. Взаимодействие clipRect и матрицы рисования очень сбивает с толку. Полезно распечатать:
canvas.getMatrix()
и
canvas.getClipBounds()
до и после внесения изменений в холст и перед рисованием вещей.