记录并存储曲线形状的路径
Record and store a path of a curved shape
我想在我的绘图应用程序中记录用户的输入。它可以画出任何他想要的东西,而不仅仅是直线形状。我怎样才能在一条路径上记录用户在绘制时所做的所有动作,例如,一个特定的圆圈?这是我的方法,其中 System.out.println() 是我将推送方法以保存路径的地方。
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
//respond to down, move and up events
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawPath.lineTo(touchX, touchY);
System.out.println(touchX +", " +touchY);
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
//redraw
invalidate();
return true;
}```
只需存储 (x,y) 点,并在以后需要时 'redraw' 存储它们。
(x,y),我指的是 event
getX
和 getY
值。将所有值存储在 ArrayList
中,然后您可以使用存储的值重绘形状。基本上,我建议你按照以下几行做一些事情,
创建点数组
ArrayList<Pair<Float,Float>> points = new ArrayList<>();
在数组中存储触摸点
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
//respond to down, move and up events
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
points.add(new Pair<Float, Float>(touchX, touchY));
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
points.add(new Pair<Float, Float>(touchX, touchY));
break;
case MotionEvent.ACTION_UP:
drawPath.lineTo(touchX, touchY);
System.out.println(touchX +", " +touchY);
points.add(new Pair<Float, Float>(touchX, touchY));
//At this point you might want to
//store this array somewhere
//so you can use it to redraw later if needed
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
//redraw
invalidate();
return true;
}
需要的时候可以用数组重画形状
public void drawFromArrayList(ArrayList<Pair<Float,Float>> points) {
int pointCount = points.size();
if (pointCount < 2) {
return;
}
for (int i=0;i<pointCount;i++) {
float touchX = points.get(i).first, touchY = points.get(i).second;
if(i==0) {
drawPath.moveTo(touchX, touchY);
}
drawPath.lineTo(touchX, touchY);
if(i==pointCount-1) {
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
}
}
}
我想在我的绘图应用程序中记录用户的输入。它可以画出任何他想要的东西,而不仅仅是直线形状。我怎样才能在一条路径上记录用户在绘制时所做的所有动作,例如,一个特定的圆圈?这是我的方法,其中 System.out.println() 是我将推送方法以保存路径的地方。
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
//respond to down, move and up events
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawPath.lineTo(touchX, touchY);
System.out.println(touchX +", " +touchY);
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
//redraw
invalidate();
return true;
}```
只需存储 (x,y) 点,并在以后需要时 'redraw' 存储它们。
(x,y),我指的是 event
getX
和 getY
值。将所有值存储在 ArrayList
中,然后您可以使用存储的值重绘形状。基本上,我建议你按照以下几行做一些事情,
创建点数组
ArrayList<Pair<Float,Float>> points = new ArrayList<>();
在数组中存储触摸点
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
//respond to down, move and up events
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
points.add(new Pair<Float, Float>(touchX, touchY));
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
points.add(new Pair<Float, Float>(touchX, touchY));
break;
case MotionEvent.ACTION_UP:
drawPath.lineTo(touchX, touchY);
System.out.println(touchX +", " +touchY);
points.add(new Pair<Float, Float>(touchX, touchY));
//At this point you might want to
//store this array somewhere
//so you can use it to redraw later if needed
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
//redraw
invalidate();
return true;
}
需要的时候可以用数组重画形状
public void drawFromArrayList(ArrayList<Pair<Float,Float>> points) {
int pointCount = points.size();
if (pointCount < 2) {
return;
}
for (int i=0;i<pointCount;i++) {
float touchX = points.get(i).first, touchY = points.get(i).second;
if(i==0) {
drawPath.moveTo(touchX, touchY);
}
drawPath.lineTo(touchX, touchY);
if(i==pointCount-1) {
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
}
}
}