背景として含まれる画像にフィンガーペイントを行っています。画像に線や弧を描いた後、指のタッチを使用してペイントを消去する消去機能が必要です。
私はこれについてグーグルで検索しましたが、適切な解決策が見つかりませんでした。最小の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);
}
}
}
}
達成するために、これに対する解決策を提案してください。