java - Drawing a Bezier curve Android drawing app is very slow -
i have been working on android drawing application, meant draw bezier line, based upon user interaction. user draws line on screen , appears have drawn it.
@override public boolean ontouchevent(motionevent event) { touchx = event.getx(); touchy = event.gety(); switch (event.getaction()) { case motionevent.action_down: drawingelement = new drawingelement(gridtype, canvaswidth, canvasheight); drawingelement.addpoint(touchx, touchy); break; case motionevent.action_move: drawingelement.addpoint(touchx, touchy); break; case motionevent.action_up: drawingelement.addpoint(touchx, touchy); actualdrawingelement = new drawpath(gridtype, canvaswidth, canvasheight, drawpaint, paintcolor, brushsize); actualdrawingelement.setdrawingelementtype(drawingelementtype.path); actualdrawingelement.setpoints(drawingelement.getpoints()); drawingelement = actualdrawingelement; actualdrawingelement = null; finishedelement = true; break; default: return false; } //draw view - called after touch event @override protected void ondraw(canvas canvas) { if(bgpaint == null) { bgpaint = new paint(); bgpaint.setcolor(color.white); } canvas.drawrect(0, 0, getwidth(), getheight(), bgpaint); bitmap dbbmp = null; bitmapsave bitmapsave = getdatabasehandler().getlastsave(); if(bitmapsave != null) { dbbmp = bitmapsave.getbitmap().copy(bitmap.config.argb_8888, true); } else { dbbmp = bitmap.createbitmap((int) getactualwidth(), (int) getactualheight(), bitmap.config.argb_8888); } canvas dbcanvas = new canvas(dbbmp); drawpath p; if(drawingelement != null && drawingelement.getpointcount() > 0) { actualdrawingelement = new drawpath(gridtype, canvaswidth, canvasheight, drawpaint, paintcolor, brushsize); actualdrawingelement.setdrawingelementtype(drawingelementtype.path); actualdrawingelement.setpoints(drawingelement.getpoints()); p = (drawpath)actualdrawingelement; p.draw(dbcanvas); p = null; } if(finishedelement) { db.addsave(new bitmapsave(dbbmp)); } canvas.drawbitmap(dbbmp, 0, 0, drawpaint); if(displaygrid) { drawgrid drawgrid = new drawgrid(gridtype, canvaswidth, canvasheight, bgpaint); drawgrid.draw(canvas); } updateundoredobuttons(); } the above code shows ondraw , ontouchevent methods. moved using database store bitmaps started lot of memory overload errors , crash. had multiple bitmaps in memory undo/redo inside arraylist (would max. 3 or 4 before crashing). have @ least 20 undos/redos (in total) in app.
in end meant draw multiple lines @ same time, 1 line slow.
i have tried abstract few things happening, eg. line drawing... store points in separate class, grabs them later on draw.
abstracted line drawing method is...
public void draw(canvas canvas) { boolean firstrun = true; point2d prevpoints = null; point2d points = null; for(point2d pointgrp : getpoints()) { points = getcalculatedpoints(pointgrp); if (firstrun) { paths.add(new path()); paths.get(0).moveto(points.getposx(), points.getposy()); } else { paths.get(0).quadto(prevpoints.getposx(), prevpoints.getposy(), points.getposx(), points.getposy()); } firstrun = false; prevpoints = points; } canvas.drawpath(paths.get(0), getpaint()); } at stage "points = getcalculatedpoints(pointgrp);" literally returns same point give. point2d object holds pointx, , pointy nothing else. has no methods other getters , setters.
any ideas why running slow? picks 4 points across massive line, making jagged , straight.
Comments
Post a Comment