android(多点触控)绘图app撤消功能

android(多点触控)绘图app撤消功能,第1张

概述我正在绘制一个绘图应用程序,onTouchEvents是标准的,并且想要添加Undo()函数来删除最后绘制的路径. 声明: int thelastLineId=0;private Bitmap bitmap; // drawing area for display or savingprivate Canvas bitmapCanvas; // used to draw on bitmapp 我正在绘制一个绘图应用程序,ontouchEvents是标准的,并且想要添加Undo()函数来删除最后绘制的路径.

声明:

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撤消功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1124837.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存