update for anyone interested. i found some more info about the
problem ... i get the same results if i change my call to drawBitmap
to:

surfaceCanvas.drawBitmap(sprite, (int)x, (int)y, null);

after looking thru the android source, the underlying native call
appears to take floats for position too ... so still not sure,
ultimately, what's going on, but the draw position is clearly being
rounded to the nearest pixel ...


On Oct 4, 9:49 pm, newbyca <newb...@gmail.com> wrote:
> i recently tried using a SurfaceView to draw a large collection of
> circles to a Canvas arranged in a ring shape. just to prototype the
> idea i originally wrote some code that effectively went like this:
>
>                         Paint paint = new Paint();
>                         paint.setStyle(Paint.Style.STROKE);
>                         paint.setStrokeWidth(1);
>                         paint.setAntiAlias(true);
>                         paint.setStrokeCap(Cap.ROUND);
>                         paint.setColor(0xffffffff);
>
>                         int circleSize = 20;
>                         int circleCount = 50;
>                         double theta = 0;
>                         double thetaDelta = 2*Math.PI/circleCount;
>                         int ringRadius = 100;
>                         for(int idx = 0; idx < circleCount; idx++){
>                                 float x = (float)(ringRadius * 
> Math.cos(theta) + (surfaceWidth -
> circleSize)/2);
>                                 float y = (float)(ringRadius * 
> Math.sin(theta) + (surfaceHeight -
> circleSize)/2);
>                                 surfaceCanvas.drawCircle(x + circleSize/2, y 
> + circleSize/2,
> circleSize/2 - 2, paint);
>                                 theta += thetaDelta;
>                         }
>
> [this code sits in a "draw" method being called by a non-ui thread]
>
> for the number of iterations above it works great. but as
> "circleCount" gets higher, the performance penalty of
> canvas.drawCircle() because noticeable.
>
> so, i decided to try using a sprite instead. i changed the code to
> draw a single circle to a bitmap first, then draw that bitmap to the
> canvas for each iteration instead. here's the new code:
>
>                         Paint paint = new Paint();
>                         paint.setStyle(Paint.Style.STROKE);
>                         paint.setStrokeWidth(1);
>                         paint.setAntiAlias(true);
>                         paint.setStrokeCap(Cap.ROUND);
>                         paint.setColor(0xffffffff);
>
>                         int circleSize = 20;
>                         int circleCount = 50;
>                         Bitmap sprite = Bitmap.createBitmap(circleSize, 
> circleSize,
> Config.ARGB_8888);
>                         Canvas spriteCanvas = new Canvas(sprite);
>                         spriteCanvas.drawCircle(circleSize/2, circleSize/2, 
> circleSize/2 -
> 2, paint);
>
>                         double theta = 0;
>                         double thetaDelta = 2*Math.PI/circleCount;
>                         int ringRadius = 100;
>                         for(int idx = 0; idx < circleCount; idx++){
>                                 float x = (float)(ringRadius * 
> Math.cos(theta) + (surfaceWidth -
> circleSize)/2);
>                                 float y = (float)(ringRadius * 
> Math.sin(theta) + (surfaceHeight -
> circleSize)/2);
>                                 surfaceCanvas.drawBitmap(sprite, x, y, null);
>                                 theta += thetaDelta;
>                         }
>                         sprite.recycle();
>                         sprite = null;
>
> this code performed significantly better ... but then i noticed that
> there was something off about the visual result. it's a little hard to
> explain, but it basically looked like there was a rounding error
> happening when drawing the sprite to surfaceCanvas: the rendered
> circles did not appear to be spaced evenly as they did in the initial
> code.
>
> here's a picture of what i get using the first 
> code:http://www.1908media.com/wp-content/shaperendered.jpg
>
> here's a picture of what i get using the sprite 
> code:http://www.1908media.com/wp-content/spriterendered.jpg
>
> i tried several things to get my sprite code to come out right ... the
> only thing that eventually worked for me was to position *as well as
> rotate* the sprite and paint it to the canvas using a separate Paint
> object with anti-aliasing and filterBitmap enabled. i implemented this
> using canvas.drawBitmap( bmp, matrix, paint ). but this incurred an
> even greater performance penalty than canvas.drawCircle()!
>
> i'm only barely knowledgeable of openGL, so hoping someone can
> enlighten me as to what's not right with the second code block
> above ... thoughts anyone?
>
> fwiw, i saw the same results on my n1 running 2.2 as i did on an
> emulator running 1.6
>
> tia//

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to