Использование clipRect – объяснение

public class POCII extends Activity { myView mv = new myView(this); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(mv); } } class myView extends View { public myView(Context context) { super(context); } @Override public void onDraw(Canvas canvas) { Paint paint = new Paint(); canvas.drawRect(0,0,100,100, paint); canvas.clipRect(0,0,50,50); } } 

Мой вопрос: не должен ли приведенный выше код нарисовать прямоугольник, а затем обрезать верхнюю левую часть? Прямоугольник не обрезается.

Пожалуйста, объясните, что делает clipRect. Что это на самом деле обрезает? Записывает ли он в виде прямоугольника, учитывая координаты? Если да, то почему приведенный выше код не работает?

Холст. ClipRect (левый, верхний, правый, нижний) уменьшает область экрана, на которую могут записывать операции будущего рисования. Он устанавливает, что clipBounds является пространственным пересечением текущего обрезающего прямоугольника и указанного прямоугольника. Существует много вариантов метода clipRect, которые принимают разные формы для регионов и позволяют выполнять разные операции по обтравочному прямоугольнику. Если вы хотите явно установить область отсечения, попробуйте:

 canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE); 

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

Попробуйте переместить оператор clipRect перед оператором drawRect. Или, попробуйте добавить:

 paint.setColor(Color.YELLOW); drawRect(0,0,75,75); 

После существующего оператора clipRect. Он должен нарисовать желтый квадрат размером 50×50 над тем, что у вас было до этого.

Еще одно замечание: (после долгого разочарования по-видимому, в основном недокументированным View / ViewGroup / рисунком) я обнаружил, что canvas.translate (x, y) также настраивает clipRect. Взаимодействие clipRect и матрицы рисования очень сбивает с толку. Полезно распечатать:

 canvas.getMatrix() 

а также

 canvas.getClipBounds() 

До и после изменений на холсте и перед рисованием вещей.

ICS и выше …

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

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

MyView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

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

Чтобы обрезать верхнюю левую часть, выполните следующие действия:

 canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE); // secondly... canvas.drawRect(0,0,100,100, paint);