【发布时间】:2013-02-03 03:53:04
【问题描述】:
我正在开发一个绘图应用程序,onTouchEvents 是标准的,我想添加Undo() 函数来删除最后绘制的路径。
声明:
int thelastLineId=0;
private Bitmap bitmap; // drawing area for display or saving
private Canvas bitmapCanvas; // used to draw on bitmap
private Paint paintScreen; // use to draw bitmap onto screen
private Paint paintLine; // used to draw lines onto bitmap
private HashMap<Integer, Path> pathMap; // current Paths being drawn
private HashMap<Integer, Path> reservedpathMap; // for saving the paths being undone
private HashMap<Integer, Point> previousPointMap; // current Points
构造函数:
pathMap = new HashMap<Integer, Path>();
reservedpathMap = new HashMap <Integer,Path>(); // for storing path being undone
previousPointMap = new HashMap<Integer, Point>();
onDraw:
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawBitmap(bitmap, 0, 0, paintScreen);
// for each path currently being drawn
for (Integer key : pathMap.keySet())
canvas.drawPath(pathMap.get(key), paintLine); // draw line
}
onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event)
{
int action = event.getActionMasked(); // event type
int actionIndex = event.getActionIndex(); // pointer (i.e., finger)
if (action == MotionEvent.ACTION_DOWN)
{
touchStarted(event.getX(actionIndex), event.getY(actionIndex), event.getPointerId(actionIndex));
}
else if (action == MotionEvent.ACTION_UP)
{
touchEnded(event.getPointerId(actionIndex));
}
else
{
touchMoved(event);
}
invalidate();
return true;
}
touchStarted:
private void touchStarted(float x, float y, int lineID) // lineID represents how many fingers, 1 finger 1 line
{
Path path; // used to store the path for the given touch id
Point point; // used to store the last point in path
// if there is already a path for lineID
if (pathMap.containsKey(lineID))
{
path = pathMap.get(lineID); // get the Path
path.reset(); // reset the Path because a new touch has started
point = previousPointMap.get(lineID); // get Path's last point
}
else
{
path = new Path(); // create a new Path
pathMap.put(lineID, path); // add the Path to Map
point = new Point(); // create a new Point
previousPointMap.put(lineID, point); // add the Point to the Map
}
path.moveTo(x, y);
point.x = (int) x;
point.y = (int) y;
}
触摸移动:
private void touchMoved(MotionEvent event)
{
// for each of the pointers in the given MotionEvent
for (int i = 0; i < event.getPointerCount(); i++)
{
// get the pointer ID and pointer index
int pointerID = event.getPointerId(i);
int pointerIndex = event.findPointerIndex(pointerID);
// if there is a path associated with the pointer
if (pathMap.containsKey(pointerID))
{
float newX = event.getX(pointerIndex);
float newY = event.getY(pointerIndex);
// get the Path and previous Point associated with this pointer
Path path = pathMap.get(pointerID);
Point point = previousPointMap.get(pointerID);
float deltaX = Math.abs(newX - point.x);
float deltaY = Math.abs(newY - point.y);
if (deltaX >= TOUCH_TOLERANCE || deltaY >= TOUCH_TOLERANCE)
{
path.quadTo(point.x, point.y, ((newX + point.x)/2),((newY + point.y)/2));
point.x = (int) newX ;
point.y = (int) newY ;
}
}
}
touchEnded:
private void touchEnded(int lineID)
{
Path path = pathMap.get(lineID); // get the corresponding Path
bitmapCanvas.drawPath(path, paintLine);
path.reset();
}
撤消:
public void undo()
{
Toast.makeText(getContext(), "undo button pressed" + thelastLineId, Toast.LENGTH_SHORT).show();
Path path = pathMap.get(thelastLineId);
reservedpathMap.put(thelastLineId, path); // add the Path to reservedpathMap for later redo
pathMap.remove(thelastLineId);
invalidate();
}
问题:
我正在尝试使用如上所示的代码实现UNDO方法:尝试从HashMappathmap中删除thelastLindId键(并放入HashMap reservedpathMap以供稍后重做)这样当@987654335 @ 它将调用OnDraw() 并通过
for (Integer key : pathMap.keySet())
canvas.drawPath(pathMap.get(key), paintLine);
但是,按下撤消按钮可以启动“撤消已单击”的吐司,但最后绘制的线未能消失。
谁能给我一个 Undo() 和 Redo() 的线索?非常感谢提前!
【问题讨论】:
-
你确定这段代码实际上是在删除最后一行吗?你有没有检查过你的 hashmap 的大小和里面的值?
-
我刚刚添加了一个 Toast.makeText(getContext(), "touchEnded" + pathMap.size(), Toast.LENGTH_SHORT).show();在 TouchEnded 方法并尝试绘制以显示吐司。我发现当第一次用一根手指画时,它显示大小 = 1,但是,当用一根手指继续画第二行时,它仍然显示大小 = 1。然后我进一步尝试用 2 个手指画第三和第四同时它显示大小= 2。使用后 1 个手指绘制第 5 行大小显示 2。使用 3 个手指绘制第 6、7、8 行它显示大小 = 3。我真的不知道为什么。
标签: android canvas path hashmap