
声明:
int thelastlineID=0;private Bitmap bitmap; // drawing area for display or savingprivate Canvas bitmapCanvas; // used to draw on bitmapprivate Paint paintScreen; // use to draw bitmap onto screenprivate Paint paintline; // used to draw lines onto bitmapprivate HashMap<Integer,Path> pathMap; // current Paths being drawnprivate HashMap<Integer,Path> reservedpathMap; // for saving the paths being undoneprivate HashMap<Integer,Point> prevIoUsPointMap; // current Points
构造函数:
pathMap = new HashMap<Integer,Path>();reservedpathMap = new HashMap <Integer,Path>(); // for storing path being undoneprevIoUsPointMap = new HashMap<Integer,Point>();
onDraw有:
@OverrIDe protected voID onDraw(Canvas canvas) { canvas.drawBitmap(bitmap,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; } touchmoved:
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方法:尝试从HashMap路径图中删除thelastlindID键(并将其放到HashMap后面的稍后重做的路径映射),这样当invalIDate()时它将调用OnDraw()并且重绘
for (Integer key : pathMap.keySet()) canvas.drawPath(pathMap.get(key),paintline);
但是,按下撤消按钮可以启动“撤消被点击”的祝酒,但最后绘制的行无法消失.
有人可以给我一个Undo()和Redo()的线索吗?提前谢谢了!!
解决方法 因为我可以理解你想要实现的目标,所以你希望能够在画布上绘制线条,之后为你的项目制作UNDO功能.首先,我认为当您向阵列添加路径时,应该是当用户用touchended方法抬起手指时.其次,我真的没有得到关于两个/三个手指的解释?你在画布上支持多点触控吗?这是我之前在一些示例中使用的实现,用于在具有撤消实现的画布上绘图.希望它能帮助你更清楚地做到:public voID onClickUndo () { if (paths.size()>0) { undonePaths.add(paths.remove(paths.size()-1)) invalIDate(); } else //toast the user }public voID onClickRedo (){ if (undonePaths.size()>0) { paths.add(undonePaths.remove(undonePaths.size()-1)) invalIDate(); } else //toast the user } 以下是您触摸方法的等价物:
@OverrIDeprotected voID onSizeChanged(int w,int h,int olDW,int oldh) { super.onSizeChanged(w,h,olDW,oldh);}@OverrIDeprotected voID onDraw(Canvas canvas) { for (Path p : paths){ canvas.drawPath(p,mPaint); }}private float mX,mY;private static final float touch_TolERANCE = 0;private voID touch_start(float x,float y) { mPath.reset(); mPath.moveto(x,y); mX = x; mY = y;}private voID touch_move(float x,float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= touch_TolERANCE || dy >= touch_TolERANCE) { mPath.quadTo(mX,mY,(x + mX)/2,(y + mY)/2); mX = x; mY = y; }}private voID touch_up() { mPath.lineto(mX,mY); // commit the path to our offscreen mCanvas.drawPath(mPath,mPaint); // kill this so we don't double draw mPath = new Path(); paths.add(mPath);} 从这里你可以看到路径是我存储路径的arrayList.如果你告诉我为什么你需要把你的路径放在hashmap中,我可能会更有帮助.
总结以上是内存溢出为你收集整理的android(多点触控)绘图app撤消功能全部内容,希望文章能够帮你解决android(多点触控)绘图app撤消功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)