Android: issue with path style in Region.Op

My main goal is to subtract Path from a predefined area (also created using Path) in Android 1.6.

In any case, so that Region.setPath handles the traversed path in the same way that the canvas refers to the stroked path (is that what my users see)?

I understand that style is used to draw on canvas, but I need behavior to reflect what is drawn on the canvas, and the path drawn is Stroked.

The behavior works when adding shapes to a path (path.addRect, path.addCircle), but not when using lineTo, quadTo, cubeTo. My only other option is to make a path consisting of nothing but rectangles or circles.

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."); } } } 

}

+4
source share

All Articles