0

背景として含まれる画像にフィンガーペイントを行っています。画像に線や弧を描いた後、指のタッチを使用してペイントを消去する消去機能が必要です。

私はこれについてグーグルで検索しましたが、適切な解決策が見つかりませんでした。最小のAndroidバージョン2.2向けに開発しています

ここに私がこれまでに行った私のコードがあります。

public class DrawPanel extends View {

    private Paint p;
    private ArrayList<Point> points;
    private ArrayList<ArrayList<Point>> strokes;
    private ArrayList<Paint> mVisiblePaints = new ArrayList<Paint>();
    int currentColor;
    boolean isDraw = true;



    public DrawPanel(Context context) {
        super(context);
        setFocusable(true);
        setFocusableInTouchMode(true);
        points = new ArrayList<Point>();
        strokes = new ArrayList<ArrayList<Point>>();
        currentColor = Color.RED;

    }

    @Override
    public void onDraw(Canvas c) {
        super.onDraw(c);
        int i = 0;
        for (ArrayList<Point> obj : strokes) {
            Paint paint = mVisiblePaints.get(i);
            drawStroke( obj, c, paint);
            i++;
        }
        if (p != null)
        drawStroke(points, c, p);



    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
            p = createPaint(currentColor, 10);
            invalidate();
        }
        if (event.getActionMasked() == MotionEvent.ACTION_MOVE) {
            if (isDraw)
            {
            points.add(new Point((int) event.getX(), (int) event.getY()));
            }
            else
            eraseScreen(new Point((int) event.getX(), (int) event.getY()));
            invalidate();
        }

        if (event.getActionMasked() == MotionEvent.ACTION_UP) 
        {
            this.strokes.add(points);
            points = new ArrayList<Point>();
            mVisiblePaints.add(p);
            invalidate();
        }

        return true;
    }

    private void drawStroke(ArrayList<Point> stroke, Canvas c, Paint paint) {
        if (stroke.size() > 0) {
            Point p0 = (Point) stroke.get(0);
            for (int i = 1; i < stroke.size(); i++) {
                Point p1 = (Point) stroke.get(i);
                c.drawLine(p0.x, p0.y, p1.x, p1.y, paint);
                p0 = p1;
            }
        }
    }

    private Paint createPaint(int color, float width) {
        Paint temp = new Paint();
        temp.setStyle(Paint.Style.STROKE);
        temp.setDither(true);
        temp.setAntiAlias(true);
        temp.setColor(color);
        temp.setStrokeWidth(width);
        temp.setStrokeCap(Cap.ROUND);
        temp.setStrokeJoin(Paint.Join.ROUND);
        return temp;
    }

    /**
     * Sets the current drawing color.
     * 
     * @param color
     */
    public void setColor(int color) {
        currentColor = color;
    }

    public void setIsDraw(boolean isDraw) {
        this.isDraw = isDraw;
    }

    public boolean getIsDraw() {
        return isDraw;
    }

    public void eraseScreen(Point p)
    {
        for(int i=0;i<strokes.size();i++)
        {
            ArrayList<Point> listPoints=strokes.get(i);
            //ArrayList<Point> drawPoints=new ArrayList<Point>();
            if(listPoints.size()>0)
            {
            for(int j=0;j<listPoints.size();j++)
            {
                Point pp=listPoints.get(j);
                float dx = Math.abs(p.x - pp.x);
                float dy = Math.abs(p.y - pp.y);
                if(dx<=5 && dy<=5)
                {
                    listPoints.remove(j);
                }
            }
            strokes.add(i, listPoints);
            }
        }
    }
}

達成するために、これに対する解決策を提案してください。

4

2 に答える 2