Подтвердить что ты не робот

Использование 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. Что это на самом деле обрезает? Записывает ли он в виде прямоугольника, учитывая координаты? Если да, то почему приведенный выше код не работает?

4b9b3361

Ответ 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()

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

Ответ 2

ICS и выше...

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

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

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

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

Ответ 3

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

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