Wow.. Thank you .. Very detailed and helpful answer.. Helped me a lot.. The problem was the calculation of radius from the points.. Thanks again :)
On Fri, Feb 22, 2013 at 8:42 PM, Nobu Games <[email protected]>wrote: > Alright, let's try to help you again. First of all your problem is as > follows: > > 1. On first touch (ACTION_DOWN) you determine the center point "C" of the > circle. > 2. While moving the finger you determine the radius of the circle by > measuring the distance from the center point C to the current move > coordinate "M". > 3. On ACTION_UP the drawn circle gets "permanently" drawn to the drawing > surface > > You already solved number 1. Center point C gets stored in downx and downy. > > Number two isn't that complicated either. First of all get rid of your > "axis" Collection objects. You can calculate the circle's radius right > there by measuring the distance from (downx;downy) to your current touch > event point. By the way you can use the existing Android framework method > PointF.length(float, > float)<http://developer.android.com/reference/android/graphics/PointF.html#length%28float,%20float%29>for > that. > > Now to the tricky part and I believe that is where your actual problem > stems from. The difficulty is having both a "live" update of the circle > while resizing it and displaying all previously drawn circles at the same > time. > > I assume you created your own custom view with an overridden > onDraw(Canvas)<http://developer.android.com/reference/android/view/View.html#onDraw%28android.graphics.Canvas%29>method. > That onDraw method is meant for drawing the current state of the > view. So on each update you start with a completely blank canvas and you > have to re-create all previously drawn circles and the one you are > currently drawing using touch input. > > In order to get that right you have to do the following: > > - let your onTouch event handler method invalidate the drawing view. > - let your drawing view's onDraw method draw all previously rendered > circles > - let your drawing view's onDraw method render the currently drawn > circle as follows: > > float radius = Math.sqrt(Math.pow(downx - movex, 2) + Math.pow(downy - >> movey, 2)); >> canvas.drawCircle(downx, downy, radius, paint); >> > > > For re-creating the previously drawn circles you have two options: > > In your ACTION_UP case block you can... > > 1. ...store all circle center points and their radiuses in a list data > structure. In onDraw you need to iterate that list and re-draw each circle > 2. ...render that circle in a separate Bitmap object that contains all > already drawn circles. > > Option number 2 is much more efficient because if you would implement > number 1: the more you draw the more work for your view's onDraw method on > each rendering update. > > You can implement option number 2 by creating a Bitmap of the size of your > drawing view. Then you need to create a Canvas object for that bitmap: > > drawnCirclesBitmap = Bitmap.createBitmap(drawingView.getWidth(), >> drawingView.getHeight(), Bitmap.Config.ARGB_8888); >> drawnCirclesCanvas = new Canvas(drawnCirclesBitmap); > > > use the drawnCirclesCanvas for drawing your finished circles in the > ACTION_UP case block. Then you need to change your drawing view's onDraw > method a bit. It has to draw the bitmap "drawnCirclesBitmap" at the > position (0;0): > > protected void onDraw(Canvas canvas) { >> canvas.drawBitmap(drawnCirclesBitmap, 0, 0, null); >> canvas.drawCircle(downx, downy, radius, paint); >> } >> > > > On Friday, February 22, 2013 3:20:59 AM UTC-6, Numair Qadir wrote: >> >> Hi! Greetings! >> I'm working in onTouch method to draw a circle, what i'm trying is to >> draw a circle when user draws on the screen, without using any fixed >> radius. Radius should calculate from the distance. I've tried but it is not >> drawing what i want. Here is my code >> >> @Override >> public boolean onTouch(View bg, MotionEvent event) { >> // TODO Auto-generated method stub >> dumpEvent(event); >> >> final int action = event.getAction(); >> switch (action & MotionEventCompat.ACTION_MASK) { >> case MotionEvent.ACTION_DOWN: >> downx = event.getX(); >> downy = event.getY(); >> xaxis.clear(); >> yaxis.clear(); >> Log.d(TAG, "DOWN"); >> break; >> >> case MotionEvent.ACTION_MOVE: >> //drawCircle(event); >> for (int i = 0; i < event.getPointerCount(); i++) { >> xaxis.add(Integer.valueOf((**int) event.getX(i))); >> yaxis.add(Integer.valueOf((**int) event.getY(i))); >> } >> // Collections.sort(xaxis); >> // Collections.sort(yaxis); >> Log.d(TAG, "DRAG"); >> return true; >> >> case MotionEvent.ACTION_UP: >> upx = event.getX(); >> upy = event.getY(); >> >> if (xaxis.size()==0 && yaxis.size()==0){ >> Log.d(TAG, "Arraylist is empty"); >> } >> else { >> minx = xaxis.get(0); >> miny = yaxis.get(0); >> for (int i = 0; i < xaxis.size(); i++){ >> maxx = xaxis.get(i); >> } >> for (int j = 0; j < yaxis.size(); j++) { >> maxy = yaxis.get(j); >> } >> double temp = Math.pow((maxx - minx), 2) >> + Math.pow((maxy - miny), 2); >> float radius = (float) Math.sqrt(temp) / 2; >> canvas.drawCircle(minx, miny, radius, paint); >> } >> choosenImageView.invalidate(); >> mode = NONE; >> Log.d(TAG, "mode=NONE"); >> return true; >> >> } >> choosenImageView.invalidate(); >> return true; >> } >> >> >> Help needed! >> > -- > -- > You received this message because you are subscribed to the Google > Groups "Android Developers" group. > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected] > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Android Developers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en --- You received this message because you are subscribed to the Google Groups "Android Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.

