วิธีการใช้งาน ItemizedOverlay และ OverlayItem อย่างมีประสิทธิภาพใน Android Beta 0.9

หากคุณเป็นนักพัฒนาที่ทำงานกับ Android คุณอาจพบปัญหาเมื่อพยายามใช้งานฟีเจอร์ ItemizedOverlay และ OverlayItem ในแอปพลิเคชันแผนที่ของคุณ โดยเฉพาะใน Android Beta 0.9 บทความนี้มีเป้าหมายเพื่อสำรวจปัญหาทั่วไปในบริบทนี้และนำเสนอวิธีแก้ปัญหาที่ละเอียดซึ่งจะช่วยให้คุณสามารถทำให้สัญลักษณ์บนแผนที่ทำงานได้อย่างราบรื่น

ปัญหา

เมื่อพยายามใช้ ItemizedOverlay เพื่อสร้างสัญลักษณ์บนแผนที่ของคุณ (คล้ายกับที่เห็นใน Google Maps) คุณอาจสังเกตเห็นว่าสัญลักษณ์ไม่ปรากฏตามที่คาดหวัง สถานการณ์ที่คุณอาจคุ้นเคยมีดังนี้:

  • คุณได้ตั้งค่า MyItemizedOverlay class ซึ่งขยายจาก ItemizedOverlay
  • เมื่อคุณพยายามเพิ่ม overlay นี้ใน MapView ของคุณ มันไม่แสดงสัญลักษณ์ใดๆ แม้ว่าจะสามารถดึง OverlayItems ได้สำเร็จ

นี่คือโค้ดตัวอย่างที่คุณอาจใช้ในการเพิ่ม overlay:

private void addItemizedOverlay() {
  Resources r = getResources();
  MapView mapView = (MapView)findViewById(R.id.mymapview);
  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();
}

การกำหนดคลาส

คลาส MyItemizedOverlay ของคุณอาจถูกกำหนดดังนี้:

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;
  } 
}

วิธีแก้ไข: การตั้งค่าช่วงสำหรับ Drawable ของคุณ

ปัญหาหลักมักอยู่ที่การขาดช่วง (bounds) ที่กำหนดไว้สำหรับ Drawable ที่เกี่ยวข้องกับสัญลักษณ์ของคุณ นี่คือวิธีการแก้ไข:

ขั้นตอนที่ 1: ตั้งค่าช่วงสำหรับ Drawable

ก่อนที่คุณจะเพิ่ม ItemizedOverlay ของคุณ ให้แน่ใจว่าคุณได้กำหนดช่วง (bounds) สำหรับ drawable ของคุณ นี่เป็นสิ่งสำคัญเพราะเมธอด draw ของ drawable ขึ้นอยู่กับช่วงเหล่านี้ในการเรนเดอร์อย่างถูกต้องบนผืนผ้าใบ นี่คือวิธีที่คุณสามารถทำได้:

Drawable defaultMarker = r.getDrawable(R.drawable.icon);

// ตั้งช่วงสำหรับ drawable ของคุณ
defaultMarker.setBounds(0, 0, defaultMarker.getIntrinsicWidth(),
    defaultMarker.getIntrinsicHeight());

MyItemizedOverlay markers = new MyItemizedOverlay(defaultMarker);
overlays.add(markers);

ทำไมช่วงถึงมีความสำคัญ?

  • กลไกการเรนเดอร์: สัญลักษณ์ถูกวาดผ่านเมธอด Drawable.draw(Canvas) ซึ่งต้องการให้มีการกำหนดช่วง (bounds) เพื่อให้ drawable รู้ว่าต้องเรนเดอร์ที่ไหนบนผืนผ้าใบ
  • การมองเห็น: โดยปราศจากช่วงที่ถูกต้อง สัญลักษณ์ของคุณอาจไม่ปรากฏบนแผนที่ ส่งผลให้เกิดความสับสนระหว่างกระบวนการพัฒนา

แหล่งข้อมูลเพิ่มเติม

สำหรับข้อมูลเพิ่มเติมและการสอนที่ละเอียด คุณสามารถตรวจสอบแหล่งข้อมูลต่อไปนี้:

บทสรุป

โดยการตั้งค่าช่วง (bounds) อย่างถูกต้องสำหรับ Drawable ของคุณ คุณควรพบว่า ItemizedOverlay ของคุณทำงานตามที่ตั้งใจไว้ โดยแสดงสัญลักษณ์บนแผนที่ของคุณ วิธีแก้ไขนี้เป็นสิ่งสำคัญสำหรับนักพัฒนาที่เผชิญปัญหาคล้ายกันใน Android Beta 0.9 ทำให้ประสบการณ์การพัฒนาที่ราบรื่นขึ้นเมื่อคุณใช้งานฟีเจอร์แผนที่ในแอปพลิเคชันของคุณ

หากคุณมีคำถามเพิ่มเติมหรือต้องการแชร์ประสบการณ์ของคุณในการใช้งาน ItemizedOverlay ยินดีให้คุณแสดงความคิดเห็นด้านล่าง!