AvoidXferMode Tolerance - PullRequest
       7

AvoidXferMode Tolerance

2 голосов
/ 31 марта 2010

У меня проблема со следующим кодом:

protected void onDraw(Canvas canvas)
{
    Paint paint = new Paint();

    // Draw a blue circle
    paint.setColor(Color.BLUE);
    canvas.drawCircle(100, 100, 50, paint);

    // Draw a red circle where it collides with the blue one
    paint.setXfermode(new AvoidXfermode(Color.BLUE, 0, Mode.TARGET));
    paint.setColor(Color.RED);
    canvas.drawCircle(50, 50, 50, paint);
}

В соответствии с документацией API AvoidXfermode значение допуска 0 означает, что он ищет точное соответствие цветов. Это должно работать здесь, потому что я указываю тот же цвет, который я использовал для рисования первого круга. Но результат в том, что красный круг вообще не нарисован. Когда я вместо этого использую значение допуска 255, тогда он работает (красный круг рисуется там, где он сталкивается с синим), но это звучит неправильно, потому что с таким высоким допуском я думаю, что он должен рисовать круг ВЕЗДЕ.

Так что здесь не так? API документация? Android? Me

1 Ответ

3 голосов
/ 01 апреля 2010

Ваша битовая глубина холста RGB_565 или ARGB_8888? Я проверил это в обоих форматах. Он работал на 32-битном холсте, но не работал на 16-битном холсте. 16-битное изображение, скорее всего, не может отображать точный цвет, который вы рисуете (0xFF0000FF), поэтому оно меняется очень незначительно (и незаметно для глаз человека), когда вы рисуете первый синий круг. Затем, когда вы выполняете избегание, нацеливая точный синий цвет с допуском нуля, ничего не отображается, потому что истинного синего нет на изображении.

Допустимое отклонение 255 работает, поскольку оно позволяет избежать совпадения с "почти синим" цветом, и в результате будет получен круг, "почти красный". Если используется допуск, который высокий, вызывает беспокойство, попробуйте очень низкие допуски (начиная с 1 и повышаясь), пока не найдете малый, но все еще совпадающий с «почти синим», который вы хотите заменить.

Идеальным решением было бы прочитать значение цвета синего круга после его рисования и нацелиться на этот точный цвет. Это было бы возможно, если бы у вас было изображение холста, с которым вы работаете, и вы могли бы позвонить bitmap.getPixel(). Однако я не знаю ни одного способа получить растровое изображение холста, если у вас его еще нет (чего нет у метода onDraw).

...