Android: Problema con el estilo de ruta en Region.Op

Mi objetivo básico es restar un Camino de una región predeterminada (también creada con un Camino) en Android 1.6.

¿Hay alguna manera de obtener Region.setPath para tratar la ruta que se le pasó de la misma manera que el lienzo trata una ruta de trazo (que es lo que mis usuarios están viendo)?

Entiendo que el estilo se utiliza para la pintura al lienzo, pero necesito que el comportamiento refleje lo que se dibuja en el lienzo y el camino que se dibuja es Stroked.

El comportamiento se encuentra al agregar formas a la ruta de acceso (path.addRect, path.addCircle), pero no cuando se utiliza lineTo, quadTo, cubeTo. Mi única otra opción es componer un camino de nada pero rects o círculos.

public class ComplexRegions extends Activity { static Display display; /** Code Sample for StackOverflow */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); display = getWindowManager().getDefaultDisplay(); setContentView(new SampleView(this)); } private static class SampleView extends View { Path orig_path, finger_path; Paint dirty_paint, fingerpaint, temp_paint; Region orig_region, clip, fingerregion, tempregion; Canvas c; int h, w; public float mX, mY, dx, dy; boolean b; public SampleView(Context context) { super(context); fingerregion = new Region(); tempregion = new Region(); orig_region = new Region(); clip = new Region(); orig_path = new Path(); finger_path = new Path(); dirty_paint = new Paint(); dirty_paint.setStyle(Paint.Style.STROKE); dirty_paint.setColor(Color.BLUE); dirty_paint.setStrokeWidth(5); dirty_paint.setStrokeCap(Paint.Cap.ROUND); dirty_paint.setStrokeJoin(Paint.Join.ROUND); dirty_paint.setAntiAlias(false); fingerpaint = new Paint(); fingerpaint.setColor(Color.GREEN); fingerpaint.setStrokeWidth(10); fingerpaint.setStyle(Paint.Style.STROKE); fingerpaint.setStrokeCap(Paint.Cap.ROUND); fingerpaint.setStrokeJoin(Paint.Join.ROUND); fingerpaint.setAntiAlias(false); temp_paint = new Paint(); temp_paint.setColor(Color.RED); temp_paint.setStrokeWidth(1); temp_paint.setStyle(Paint.Style.STROKE); temp_paint.setStrokeCap(Paint.Cap.ROUND); temp_paint.setStrokeJoin(Paint.Join.ROUND); temp_paint.setAntiAlias(false); w = display.getWidth(); h = display.getHeight(); clip.set(0, 0, w, h); orig_path.addRect(w*0.25f, h*0.55f, w*0.65f, h*0.65f, Path.Direction.CW); orig_region.setPath(orig_path, clip); } @Override protected void onDraw(Canvas c) { c.drawPath(orig_path, dirty_paint); c.drawPath(finger_path, fingerpaint); //following line shows that finger_path is //behaving as though fill and stroke is on //after being passed to the region class c.drawPath(tempregion.getBoundaryPath(), temp_paint); invalidate(); } //LTRB @Override public boolean onTouchEvent(MotionEvent event) { int x = (int)event.getX(); int y = (int)event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touch_start(x, y); invalidate(); break; case MotionEvent.ACTION_MOVE: touch_move(x, y); invalidate(); break; case MotionEvent.ACTION_UP: touch_up(); invalidate(); break; } return true; } private void touch_start(float x, float y) { finger_path.moveTo(x, y); //finger_path.addCircle(x, y, 25, Path.Direction.CCW); //when addCircle is only Path method used on path the result is fine } private void touch_move(float x, float y){ finger_path.lineTo(x, y); } private void touch_up() { //*PROBLEM* Seems like setPath forces finger_path to default to fill and stroke fingerregion.setPath(finger_path, clip); //set tempregion to the region resulting from this Op tempregion.op(orig_region, fingerregion, Region.Op.DIFFERENCE); //check if the resulting region is empty if(tempregion.isEmpty()){ for(int i = 0;i<100;i++) Log.e("CR", "Region Completely Covered."); } } } 

}

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.