
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)绘图应用撤消方法无法正常工作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)