4

我的基本目标是从 Android 1.6 中的预定区域(也使用路径创建)中减去路径。

无论如何让 Region.setPath 以与画布处理描边路径相同的方式处理传递给它的路径(这是我的用户所看到的)?

我知道样式用于在画布上绘画,但我需要行为来反映画布上绘制的内容,并且绘制的路径是描边。

将形状添加到路径(path.addRect、path.addCircle)时,该行为有效,但在使用 lineTo、quadTo、cubeTo 时无效。我唯一的其他选择是组成一条只有矩形或圆形的路径。

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();
    }

    //L T R B
    @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

0 回答 0