Ответ 1
Используете ли вы HC или выше или иным образом используете аппаратное ускорение?
Если это так, clipPath неподдерживается и проблематично.
developer.android.com/guide/topics/graphics/hardware-accel.html.
Я пытаюсь скопировать операцию рисования холста в дугообразный клин. Тем не менее, я не получаю ожидаемый результат после установки обтравочного контура на холст.
Для иллюстрации, вот что я делаю:
path.reset();
//Move to point #1
path.moveTo(rect.centerX(), rect.centerY());
//Per the documentation, this will draw a connecting line from the current
//position to the starting position of the arc (at 0 degrees), add the arc
//and my current position now lies at #2.
path.arcTo(rect, 0, -30);
//This should then close the path, finishing back at the center point (#3)
path.close();
Это работает, и когда я просто рисую этот путь (canvas.drawPath(path, paint)
), он рисует клин, как показано выше. Однако, когда я устанавливаю этот путь как путь отсечения холста и рисую в него:
//I've tried it with and without the Region.Op parameter
canvas.clipPath(path, Region.Op.REPLACE);
canvas.drawColor(Color.BLUE);
Вместо этого получается следующий результат (клин остается только для показа ссылки):
Таким образом, вместо этого он привязывается к ограничительному прямоугольнику Path
, а не самому Path
. Любые идеи, что происходит здесь?
EDIT Как и обновление, я нашел гораздо более эффективный способ сделать это, что позволяет ускорить аппаратное ускорение. Сначала нарисуйте все изображение (которое вы обрезаете) в растровое изображение вне экрана. Создайте BitmapShader
, используя этот Bitmap
, установите этот шейдер в Paint
, затем нарисуйте клиновый путь, используя этот объект Paint
:
drawMyBitmap(bitmap);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(shader);
@Override
public void onDraw(Canvas canvas) {
canvas.drawArc(rect, //The rectangle bounding the circle
startAngle, //The angle (CW from 3 o'clock) to start
sweepAngle, //The angle (CW from 3 o'clock) of the arc
true, //Boolean of whether to draw a filled arc (wedge)
paint //The paint with the shader attached
);
}
Используете ли вы HC или выше или иным образом используете аппаратное ускорение?
Если это так, clipPath неподдерживается и проблематично.
developer.android.com/guide/topics/graphics/hardware-accel.html.
Вопрос OP специально посвящен использованию отсечения региона и на него ответил @Simon. Имейте в виду, однако, что существует более простой способ рисования заполненной дуги:
Создайте Paint
:
mPaint = new Paint();
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Style.FILL);
mPaint.setAntiAlias(true);
При рисовании просто нарисуйте путь:
canvas.drawPath(path, mPaint);