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