android(singletouch)绘图应用撤消方法无法正常工作

android(singletouch)绘图应用撤消方法无法正常工作,第1张

概述我正在绘制一个绘图应用程序,但面临一些撤消问题.编码如下: public class DoodleView extends View { Context context_new; private static final float TOUCH_TOLERANCE = 5; private Bitmap bitmap; // drawing area for displ 我正在绘制一个绘图应用程序,但面临一些撤消问题.编码如下:

public class DoodleVIEw extends VIEw {    Context context_new;    private static final float touch_TolERANCE = 5;    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 Path mPath;     private ArrayList<Path> paths = new ArrayList<Path>();    private ArrayList<Path> undonePaths = new ArrayList<Path>();    private float mX,mY;   // DoodleVIEw constructor initializes the DoodleVIEw   public DoodleVIEw(Context context,AttributeSet attrs)    {       super(context,attrs); // pass context to VIEw's constructor       this.context_new=context;       paintScreen = new Paint(); // used to display bitmap onto screen       // set the initial display settings for the painted line       paintline = new Paint();       paintline.setAntiAlias(true); // smooth edges of drawn line       paintline.setcolor(color.BLACK); // default color is black       paintline.setStyle(Paint.Style.stroke); // solID line       mPath = new Path();       paths.add(mPath);   } // end DoodleVIEw constructor

OnSizeChanged:

@OverrIDe   public voID onSizeChanged(int w,int h,int olDW,int oldH)   {      super.onSizeChanged(w,h,olDW,oldH);      DoodlzVIEwWIDth = w;           DoodlzVIEwHeight = h;      bitmap = Bitmap.createBitmap(getWIDth(),DoodlzVIEwHeight,Bitmap.Config.ARGB_8888);      bitmapCanvas = new Canvas(bitmap);      bitmap.erasecolor(color.WHITE); // erase the BitMap with white    }

onDraw有:

@OverrIDe   protected voID onDraw(Canvas canvas)     {       canvas.drawBitmap(bitmap,paintScreen);        // for each path currently being drawn       for (Path p : paths){canvas.drawPath(p,paintline);}                   }

的ontouchEvent:

@OverrIDe   public boolean ontouchEvent(MotionEvent event)    {                    float x = event.getX();          float y = event.getY();          switch (event.getAction())          {              case MotionEvent.ACTION_DOWN:                  touchstarted(x,y);                  invalIDate();                  break;              case MotionEvent.ACTION_MOVE:                  touchmoved(x,y);                  invalIDate();                  break;              case MotionEvent.ACTION_UP:                  touchended();                  invalIDate();                  break;          }          return true;    }

touchstarted:

private voID touchstarted(float x,float y)    {       mPath.reset();       mPath.moveto(x,y);       mX = x;       mY = y;   }

touchmoved:

private voID touchmoved(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;                      }   }

touchended:

private voID touchended()    {      mPath.lineto(mX,mY);            bitmapCanvas.drawPath(mPath,paintline);      mPath = new Path();      paths.add(mPath);      Toast.makeText(getContext(),"touchended" + paths.size(),Toast.LENGTH_SHORT).show();   }

撤销:

public voID onClickUndo() {    Toast.makeText(getContext(),"before undo button pressed " + paths.size(),Toast.LENGTH_SHORT).show();     if (paths.size()>0)     {        undonePaths.add(paths.remove(paths.size()-1));       Toast.makeText(getContext(),"after undo button pressed " + paths.size(),Toast.LENGTH_SHORT).show();       Log.i("UNDOING","PREPARE INVALIDATE");       invalIDate();       Log.i("UNDOING","FINISH INVALIDATE");    }         else Toast.makeText(getContext(),"nothing to undo" + paths.size(),Toast.LENGTH_SHORT).show();  }

题:

以上内容源自在线搜索的其他示例.不知道为什么在实现touchstarted时需要设置path.reset()?

Q1.当我按下撤销按钮时,它将正确显示按下的toast撤消按钮,并报告path.size()为0,因此不会删除之前绘制的线.我真的不知道为什么它是0?它已经添加到路径数组了吗?如何修改代码?

**在获取androID-developer的建议后修改了代码!谢谢!!它现在正确显示path.size().对不起傻丢错了!*但是之前画的线还是不能删除? =(

Q2.当手指在屏幕上移动并立即显示线条时,应用程序正常运行,当我按下撤消按钮时,除了上面没有删除前一行之外,线条在按下之后进一步绘制到屏幕在手指抬起之前,按钮不会显示.

回答Q2:
将以下2行从touchended()移动到touchstarted()

mPath = new Path();paths.add(mPath);

.

private voID touchstarted(float x,float y)    {       mPath.reset();       mPath = new Path();       paths.add(mPath);       mPath.moveto(x,y);       mX = x;       mY = y;   }   private voID touchended()    {       mPath.lineto(mX,mY);             bitmapCanvas.drawPath(mPath,paintline);// commit the path to our offscreen                          Toast.makeText(getContext(),Toast.LENGTH_SHORT).show();   }

谢谢!!!

解决方法 更新和工作:

>删除Paint paintScreen;
>在onDraw中不要放canvas.drawBitmap(位图,paintScreen);或canvas.drawBitmap(位图,paintline);

private Bitmap bitmap; // drawing area for display or savingprivate Canvas bitmapCanvas; // used to draw on bitmapprivate Paint paintline; // used to draw lines onto bitmap   private Path mPath; private ArrayList<Path> paths = new ArrayList<Path>();private ArrayList<Path> undonePaths = new ArrayList<Path>();private float mX,mY;private static final float touch_TolERANCE = 4;    // DoodleVIEw constructor initializes the DoodleVIEwpublic DoodleVIEw(Context context,AttributeSet attrs) {   super(context,attrs); // pass context to VIEw's constructor   this.context_new=context;   setFocusable(true);   setFocusableIntouchMode(true);         // set the initial display settings for the painted line   paintline = new Paint();   paintline.setAntiAlias(true); // smooth edges of drawn line   paintline.setDither(true);   paintline.setcolor(color.BLACK); // default color is black   paintline.setStyle(Paint.Style.stroke); // solID line   paintline.setstrokeJoin(Paint.Join.ROUND);   paintline.setstrokeWIDth(5); // set the default line wIDth   paintline.setstrokeCap(Paint.Cap.ROUND); // rounded line ends   bitmapCanvas = new Canvas();   mPath = new Path();             } // end DoodleVIEw constructor // Method onSizeChanged creates BitMap and Canvas after app displays @OverrIDe public voID onSizeChanged(int w,int oldH) {    super.onSizeChanged(w,oldH);    DoodlzVIEwWIDth = w;           DoodlzVIEwHeight = h;            }  @OverrIDe protected voID onDraw(Canvas canvas)  {            for (Path p : paths){canvas.drawPath(p,paintline);}     canvas.drawPath(mPath,paintline);   Log.i("OnDRAWING","REACH ON DRAW");        }

// START touch:处理触摸事件
     @覆盖

public boolean ontouchEvent(MotionEvent event)  {                  float x = event.getX();      float y = event.getY();      switch (event.getAction())      {          case MotionEvent.ACTION_DOWN:              touch_start(x,y);              invalIDate();              break;          case MotionEvent.ACTION_MOVE:             touch_move(x,y);              invalIDate();              break;          case MotionEvent.ACTION_UP:              touch_up();              invalIDate();              break;      }      return true;} private voID touch_start(float x,float y)  {   undonePaths.clear();   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,(y + mY)/2);        mX = x;        mY = y;    }}  private voID touch_up() {    mPath.lineto(mX,mY);          bitmapCanvas.drawPath(mPath,paintline);// commit the path to our offscreen      paths.add(mPath);    mPath = new Path(); }public voID onClickUndo() {    if (paths.size()>0)     {        undonePaths.add(paths.remove(paths.size()-1));       invalIDate();    }         else Toast.makeText(getContext(),"nothing more to undo",Toast.LENGTH_SHORT).show();  }
总结

以上是内存溢出为你收集整理的android(singletouch)绘图应用撤消方法无法正常工作全部内容,希望文章能够帮你解决android(singletouch)绘图应用撤消方法无法正常工作所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存