i've submitted a case for this issue to google:
http://code.google.com/p/android/issues/detail?id=11993

On Oct 10, 3:08 am, newbyca <newb...@gmail.com> wrote:
> 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