Seems like not much point in overriding ItemizedOverlay, what added
functionality do you really get then just overriding Overlay?

On Thu, Aug 28, 2008 at 3:24 AM, Guillaume Perrot
<[EMAIL PROTECTED]> wrote:
>
> Contact and LocationOverlayItem (extending OverlayItem to set fields
> based on a Contact) are custom classes I created for my application,
> they're not important to understand my code.
>
> On 28 août, 11:20, Guillaume Perrot <[EMAIL PROTECTED]> wrote:
>> Here is a code which is actually working, but with manual draw, you
>> can imitate my workaround for now.
>> I hope an official answer will come up fast...
>>
>> /** Map layer displaying contact locations */
>> public class LocationOverlay extends
>> ItemizedOverlay<LocationOverlayItem>
>> {
>>   /** Contacts with known location */
>>   private final List<Contact> mContacts;
>>
>>   /*
>>    * FIXME fields to manually draw items, we don't know how to make
>>    * ItemizedOverlay actually work
>>    */
>>   private Bitmap mBubbleBitmap;
>>   private Paint mInnerPaint;
>>   private Paint mBorderPaint;
>>   private TextPaint mTextPaint;
>>   private static final int TEXT_OFFSET_X = 10;
>>   private static final int TEXT_OFFSET_Y = 15;
>>   private static final int INFO_WINDOW_HEIGHT = 25;
>>
>>   /** Create a new instance */
>>   public LocationOverlay()
>>   {
>>     super(UbikIMApplication.getApplicationResources().getDrawable(
>>       R.drawable.bubble));
>>
>>     /* Get contacts with location */
>>     mContacts = new ArrayList<Contact>();
>>     for (Contact contact : ContactManager.getInstance().getContacts())
>>       if (contact.getLocation() != null)
>>         mContacts.add(contact);
>>
>>     /* Populate */
>>     populate();
>>
>>     /* FIXME manual draw managing relating code */
>>
>>     /* Decompress bubble bitmap */
>>     mBubbleBitmap = BitmapFactory.decodeResource(UbikIMApplication
>>       .getApplicationResources(), R.drawable.bubble);
>>
>>     /* Init painter used to draw the inner of the info window */
>>     mInnerPaint = new Paint();
>>     mInnerPaint.setARGB(225, 75, 75, 75);
>>     mInnerPaint.setAntiAlias(true);
>>
>>     /* Init painter used to draw the border of the info window */
>>     mBorderPaint = new Paint();
>>     mBorderPaint.setARGB(255, 255, 255, 255);
>>     mBorderPaint.setAntiAlias(true);
>>     mBorderPaint.setStyle(Style.STROKE);
>>     mBorderPaint.setStrokeWidth(2);
>>
>>     /* Init painter used to draw the text inside the info window */
>>     mTextPaint = new TextPaint();
>>     mTextPaint.setARGB(255, 255, 255, 255);
>>     mTextPaint.setAntiAlias(true);
>>   }
>>
>>   @Override
>>   protected LocationOverlayItem createItem(int i)
>>   {
>>     return new LocationOverlayItem(mContacts.get(i));
>>   }
>>
>>   @Override
>>   public int size()
>>   {
>>     return mContacts.size();
>>   }
>>
>>   @Override
>>   public void draw(Canvas canvas, MapView mapView, boolean shadow)
>>   {
>>     /* FIXME manual draw because automatic doesn't seem to work */
>>
>>     /* Retrieve map view projection to compute coordinates */
>>     Projection projection = mapView.getProjection();
>>
>>     /* For all contacts with location (including self) */
>>     for (int index = size() - 1; index >= 0; index--)
>>     {
>>       OverlayItem item = getItem(index);
>>       String title = item.getTitle();
>>       Point point = projection.toPixels(item.getPoint(), null);
>>
>>       /* Draw bubble */
>>       canvas.drawBitmap(mBubbleBitmap, point.x -
>> mBubbleBitmap.getWidth() / 2,
>>         point.y - mBubbleBitmap.getHeight(), null);
>>
>>       /* Compute info window geometry */
>>       int INFO_WINDOW_WIDTH = getTextWidth(title) + TEXT_OFFSET_X * 2;
>>       RectF infoWindowRect = new RectF(0, 0, INFO_WINDOW_WIDTH,
>>         INFO_WINDOW_HEIGHT);
>>       int infoWindowOffsetX = point.x - INFO_WINDOW_WIDTH / 2;
>>       int infoWindowOffsetY = point.y - INFO_WINDOW_HEIGHT
>>         - mBubbleBitmap.getHeight() - 2;
>>       infoWindowRect.offset(infoWindowOffsetX, infoWindowOffsetY);
>>
>>       /* Draw inner info window */
>>       canvas.drawRoundRect(infoWindowRect, 5, 5, mInnerPaint);
>>
>>       /* Draw border for info window */
>>       canvas.drawRoundRect(infoWindowRect, 5, 5, mBorderPaint);
>>
>>       /* Draw user name in the info window */
>>       canvas.drawText(title, infoWindowOffsetX + TEXT_OFFSET_X,
>>         infoWindowOffsetY + TEXT_OFFSET_Y, mTextPaint);
>>     }
>>
>>     super.draw(canvas, mapView, shadow);
>>   }
>>
>>   /* FIXME manual draw related function */
>>   /** @return text width in pixels that the text paint will use to
>> draw text */
>>   private int getTextWidth(String text)
>>   {
>>     int count = text.length();
>>     float[] widths = new float[count];
>>     mTextPaint.getTextWidths(text, widths);
>>     int textWidth = 0;
>>     for (int i = 0; i < count; i++)
>>       textWidth += widths[i];
>>     return textWidth;
>>   }
>>
>>   @Override
>>   protected boolean onTap(int index)
>>   {
>>     setFocus(getItem(index));
>>     return true;
>>   }
>>
>>   @Override
>>   protected boolean hitTest(LocationOverlayItem item, Drawable marker,
>>     int hitX, int hitY)
>>   {
>>     return super.hitTest(item, marker, hitX, hitY +
>> mBubbleBitmap.getHeight()
>>       / 2);
>>   }
>>
>> On 27 août, 20:49, "Chris Chiappone" <[EMAIL PROTECTED]> wrote:
>>
>> > Same problem here, i converted code normal overlay code that worked in
>> > order to use the "recommended" ItemizedOverlay.  Can anyone confirm
>> > that this is a bug or are we just doing something wrong.
>>
>> > Thanks.
>>
>> > On Tue, Aug 26, 2008 at 9:52 AM, Guillaume Perrot
>>
>> > <[EMAIL PROTECTED]> wrote:
>>
>> > > Hi,
>> > > I have the same problem.
>> > > The draw function is called, I tried to override it, I even added a
>> > > bitmap in the top left corner for test purposes, I see my dummy bitmap
>> > > but no items...
>>
>> > > On 26 août, 07:50, marcel-182 <[EMAIL PROTECTED]> wrote:
>> > >> Hi,
>>
>> > >> Same problem here. I added two items and I found out that even the
>> > >> draw() method from ItemizedOverlay is called but there is nothing on
>> > >> my map view. My code is quite equal to yours.
>>
>> > >> On 25 Aug., 18:29, Reto <[EMAIL PROTECTED]> wrote:
>>
>> > >> > I've been trying to use the ItemizedOverlay and OverlayItem classes in
>> > >> > the 0.9 Beta to simulate map markers but have been having some
>> > >> > problems getting it to display on the map.
>>
>> > >> > Once I've implemented my own ItemizedOverlay (and overriden
>> > >> > createItem), creating a new instance of my class seems to work (I can
>> > >> > extract OverlayItems from it) but adding it to the overlay list for
>> > >> > one of my maps doesn't seem to do anything.
>>
>> > >> > I've included the code for adding the ItemizedOverlay to the map, and
>> > >> > the ItemizedOverlay implementation itself is also included. Have I
>> > >> > done something wrong or is this functionality not yet available?
>>
>> > >> > // Add the ItemizedOverlay to the Map
>> > >> > private void addItemizedOverlay() {
>> > >> >   Resources r = getResources();
>> > >> >   mapView = (MapView)findViewById(R.id.map_view);
>> > >> >   List<Overlay> overlays = mapView.getOverlays();
>>
>> > >> >   MyItemizedOverlay markers = new
>> > >> > MyItemizedOverlay(r.getDrawable(R.drawable.icon));
>> > >> >   overlays.add(markers);
>>
>> > >> >   OverlayItem oi = markers.getItem(0);
>> > >> >   markers.setFocus(oi);
>> > >> >   mapView.postInvalidate();
>>
>> > >> > }
>>
>> > >> > Where MyItemizedOverlay is defined as:
>>
>> > >> > public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
>> > >> >   public MyItemizedOverlay(Drawable defaultMarker) {
>> > >> >     super(defaultMarker);
>> > >> >     populate();
>> > >> >   }
>>
>> > >> >   @Override
>> > >> >   protected OverlayItem createItem(int index) {
>> > >> >     Double lat = (index+37.422006)*1E6;
>> > >> >     Double lng = -122.084095*1E6;
>> > >> >     GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());
>>
>> > >> >     OverlayItem oi = new OverlayItem(point, "Marker", "Marker Text");
>> > >> >     return oi;
>> > >> >   }
>>
>> > >> >   @Override
>> > >> >   public int size() {
>> > >> >     return 5;
>> > >> >   }
>>
>> > >> > }
>>
>> > --
>> > ~chris
> >
>



-- 
~chris

--~--~---------~--~----~------------~-------~--~----~
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
[EMAIL PROTECTED]
Announcing the new Android 0.9 SDK beta!
http://android-developers.blogspot.com/2008/08/announcing-beta-release-of-android-sdk.html
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to