Próbuję przypiąć operację rysowania płótna do klina w kształcie łuku. Jednak nie otrzymuję zamierzonego wyniku po ustawieniu ścieżki przycinającej na płótnie.Canvas.clipPath (Path) nie obcinanie zgodnie z oczekiwaniami
Dla ilustracji, tutaj jest to, co robię:
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();
To działa, a kiedy po prostu narysować tę ścieżkę (canvas.drawPath(path, paint)
) czerpie klina, jak pokazano powyżej. Jednak, kiedy ustawić tę ścieżkę jako ścieżkę obcinania płótna i wyciągnąć do niego:
//I've tried it with and without the Region.Op parameter
canvas.clipPath(path, Region.Op.REPLACE);
canvas.drawColor(Color.BLUE);
pojawia się następujący wynik zamiast (klin pozostałego po prostu pokazać odniesienia):
Zamiast tego wydaje się, że przycina do prostokąta ograniczającego Path
, a nie samego Path
. Jakieś pomysły, co się tutaj dzieje?
EDYTOWANIE Tak jak aktualizacja, znalazłem o wiele bardziej efektywny sposób na zrobienie tego, co pozwala na przyspieszenie sprzętowe. Najpierw narysuj cały obraz (który chcesz przyciąć) w bitmapie poza ekranem. Zrób BitmapShader
użyciu tego Bitmap
, ustaw ten shader do Paint
, a następnie narysować ścieżkę za pomocą klina że Paint
obiektu:
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
);
}
Używasz HC lub powyżej lub w inny sposób przy użyciu przyspieszenia sprzętowego? http://developer.android.com/guide/topics/graphics/hardware-accel.html. Jeśli tak, polecenie clipPath nie jest obsługiwane i problematyczne. – Simon
@Simon: O mój boże. Heh. Niestety w tym tygodniu bardzo często odwoływałem się do tego dokumentu, ale całkowicie to przeoczyłem. Wyłączenie HW Accel działało idealnie! Jeśli napiszesz to jako odpowiedź, zaakceptuję to. Jesteś ratownikiem! – kcoppock
Cieszę się, że pomogłem. Powodzenia. – Simon