วิธีการใช้งาน 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
ยินดีให้คุณแสดงความคิดเห็นด้านล่าง!