android - एंड्रॉइड मैप एपीआई v2[डुप्लिकेट] के साथ एक कस्टम आकार के बिटमैप मार्कर कैसे बनाएं
google-maps-markers google-maps-android-api-2 (3)
इस प्रश्न का उत्तर यहां दिया गया है:
मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जहां मैं Google Map API v2 का उपयोग कर रहा हूं। मुझे कस्टम मार्कर वाले मानचित्र पर उपयोगकर्ता स्थान दिखाना होगा।
प्रत्येक मार्कर उपयोगकर्ता की तस्वीर यूआरएल से दिखाएगा। छवि सर्वर से एसिंक्रोनस मोड में डाउनलोड किया जाना चाहिए। उदाहरण के लिए संलग्न स्क्रीनशॉट देखें।
मैं मार्कर में एक छवि और कस्टम जानकारी कैसे जोड़ूं?
मुझे आशा है कि अभी भी मेरा समाधान साझा करने में बहुत देर हो चुकी है। इससे पहले, आप एंड्रॉइड डेवलपर दस्तावेज़ों में बताए गए ट्यूटोरियल का पालन कर सकते हैं। इसे प्राप्त करने के लिए, आपको defaultRenderer
प्रबंधक के साथ क्लस्टर प्रबंधक का उपयोग करने की आवश्यकता है।
ClusterItem
लागू करने वाली ऑब्जेक्ट बनाएंpublic class SampleJob implements ClusterItem { private double latitude; private double longitude; //Create constructor, getter and setter here @Override public LatLng getPosition() { return new LatLng(latitude, longitude); }
एक डिफ़ॉल्ट रेंडरर वर्ग बनाएँ। यह वह वर्ग है जो सभी नौकरी करता है (अपनी खुद की शैली के साथ कस्टम मार्कर / क्लस्टर को बढ़ाता है)। मैं छवि डाउनलोड और कैशिंग करने के लिए यूनिवर्सल छवि लोडर का उपयोग कर रहा हूं।
public class JobRenderer extends DefaultClusterRenderer< SampleJob > { private final IconGenerator iconGenerator; private final IconGenerator clusterIconGenerator; private final ImageView imageView; private final ImageView clusterImageView; private final int markerWidth; private final int markerHeight; private final String TAG = "ClusterRenderer"; private DisplayImageOptions options; public JobRenderer(Context context, GoogleMap map, ClusterManager<SampleJob> clusterManager) { super(context, map, clusterManager); // initialize cluster icon generator clusterIconGenerator = new IconGenerator(context.getApplicationContext()); View clusterView = LayoutInflater.from(context).inflate(R.layout.multi_profile, null); clusterIconGenerator.setContentView(clusterView); clusterImageView = (ImageView) clusterView.findViewById(R.id.image); // initialize cluster item icon generator iconGenerator = new IconGenerator(context.getApplicationContext()); imageView = new ImageView(context.getApplicationContext()); markerWidth = (int) context.getResources().getDimension(R.dimen.custom_profile_image); markerHeight = (int) context.getResources().getDimension(R.dimen.custom_profile_image); imageView.setLayoutParams(new ViewGroup.LayoutParams(markerWidth, markerHeight)); int padding = (int) context.getResources().getDimension(R.dimen.custom_profile_padding); imageView.setPadding(padding, padding, padding, padding); iconGenerator.setContentView(imageView); options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.circle_icon_logo) .showImageForEmptyUri(R.drawable.circle_icon_logo) .showImageOnFail(R.drawable.circle_icon_logo) .cacheInMemory(false) .cacheOnDisk(true) .considerExifParams(true) .bitmapConfig(Bitmap.Config.RGB_565) .build(); } @Override protected void onBeforeClusterItemRendered(SampleJob job, MarkerOptions markerOptions) { ImageLoader.getInstance().displayImage(job.getJobImageURL(), imageView, options); Bitmap icon = iconGenerator.makeIcon(job.getName()); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)).title(job.getName()); } @Override protected void onBeforeClusterRendered(Cluster<SampleJob> cluster, MarkerOptions markerOptions) { Iterator<Job> iterator = cluster.getItems().iterator(); ImageLoader.getInstance().displayImage(iterator.next().getJobImageURL(), clusterImageView, options); Bitmap icon = clusterIconGenerator.makeIcon(iterator.next().getName()); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)); } @Override protected boolean shouldRenderAsCluster(Cluster cluster) { return cluster.getSize() > 1; }
अपनी गतिविधि / खंड वर्ग में क्लस्टर प्रबंधक लागू करें।
public class SampleActivity extends AppCompatActivity implements OnMapReadyCallback { private ClusterManager<SampleJob> mClusterManager; private GoogleMap mMap; private ArrayList<SampleJob> jobs = new ArrayList<SampleJob>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_landing); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.getUiSettings().setMapToolbarEnabled(true); mClusterManager = new ClusterManager<Job>(this, mMap); mClusterManager.setRenderer(new JobRenderer(this, mMap, mClusterManager)); mMap.setOnCameraChangeListener(mClusterManager); mMap.setOnMarkerClickListener(mClusterManager); //Assume that we already have arraylist of jobs for(final SampleJob job: jobs){ mClusterManager.addItem(job); } mClusterManager.cluster(); }
परिणाम
लैम्ब्डा उत्तर से, मैंने कुछ आवश्यकताओं के करीब किया है।
boolean imageCreated = false;
Bitmap bmp = null;
Marker currentLocationMarker;
private void doSomeCustomizationForMarker(LatLng currentLocation) {
if (!imageCreated) {
imageCreated = true;
Bitmap.Config conf = Bitmap.Config.ARGB_8888;
bmp = Bitmap.createBitmap(400, 400, conf);
Canvas canvas1 = new Canvas(bmp);
Paint color = new Paint();
color.setTextSize(30);
color.setColor(Color.WHITE);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inMutable = true;
Bitmap imageBitmap=BitmapFactory.decodeResource(getResources(),
R.drawable.messi,opt);
Bitmap resized = Bitmap.createScaledBitmap(imageBitmap, 320, 320, true);
canvas1.drawBitmap(resized, 40, 40, color);
canvas1.drawText("Le Messi", 30, 40, color);
currentLocationMarker = mMap.addMarker(new MarkerOptions().position(currentLocation)
.icon(BitmapDescriptorFactory.fromBitmap(bmp))
// Specifies the anchor to be at a particular point in the marker image.
.anchor(0.5f, 1));
} else {
currentLocationMarker.setPosition(currentLocation);
}
}
Google मानचित्र API v2 डेमो में एक MarkerDemoActivity
क्लास है जिसमें आप देख सकते हैं कि एक कस्टम छवि GoogleMap पर कैसे सेट की जाती है।
// Uses a custom icon.
mSydney = mMap.addMarker(new MarkerOptions()
.position(SYDNEY)
.title("Sydney")
.snippet("Population: 4,627,300")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));
चूंकि यह मार्कर को एक छवि के साथ बदल देता है जिसे आप अधिक जटिल और प्रशंसक सामग्री खींचने के लिए Canvas
का उपयोग करना चाह सकते हैं:
Bitmap.Config conf = Bitmap.Config.ARGB_8888;
Bitmap bmp = Bitmap.createBitmap(80, 80, conf);
Canvas canvas1 = new Canvas(bmp);
// paint defines the text color, stroke width and size
Paint color = new Paint();
color.setTextSize(35);
color.setColor(Color.BLACK);
// modify canvas
canvas1.drawBitmap(BitmapFactory.decodeResource(getResources(),
R.drawable.user_picture_image), 0,0, color);
canvas1.drawText("User Name!", 30, 40, color);
// add marker to Map
mMap.addMarker(new MarkerOptions()
.position(USER_POSITION)
.icon(BitmapDescriptorFactory.fromBitmap(bmp))
// Specifies the anchor to be at a particular point in the marker image.
.anchor(0.5f, 1));
यह कैनवास कैनवास 1 को GoogleMap mMap
पर खींचता है। कोड (ज्यादातर) स्वयं के लिए बोलना चाहिए, Canvas
को आकर्षित करने के लिए वहां कई ट्यूटोरियल हैं। आप एंड्रॉइड डेवलपर पेज से कैनवास और ड्रायबल्स को देखकर शुरू कर सकते हैं।
अब आप एक यूआरएल से एक तस्वीर भी डाउनलोड करना चाहते हैं।
URL url = new URL(user_image_url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bmImg = BitmapFactory.decodeStream(is);
आपको पृष्ठभूमि थ्रेड से छवि डाउनलोड करनी होगी (आप इसके लिए AsyncTask या Volley उपयोग कर सकते हैं)।
उसके बाद आप अपनी डाउनलोड की गई छवि bmImg
साथ BitmapFactory.decodeResource(getResources(), R.drawable.user_picture_image)
को प्रतिस्थापित कर सकते हैं।