Я хочу создать собственный маркер в Google Map для Android.Изображение для пользовательского маркера будет получено с URL.Чтобы загрузить изображение из URL, я попробовал Picasso и Glide.
Проблема: При загрузке изображения из URL всегда отображается изображение заполнителя.Та же проблема с Picasso и Glide.
Для целей тестирования я взял два разных ImageView.Один для пользовательского маркера, а другой только для тестирования.Странная вещь, это работает для теста ImageView, но не для пользовательского маркера ImageView.Я пытался добавить слушателей, но не получал обратного вызова в методе успеха в любое время.
Мой код подобен приведенному ниже.
MapsActivity.java
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private ArrayList<Marker> markerArrayList = new ArrayList<>();
private ArrayList<MarkerData> markersDataArrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
if (mapFragment != null) {
mapFragment.getMapAsync(this);
}
setGoogleMapData();
final ImageView iv_sample = findViewById(R.id.iv_sample);
Picasso.get()
//.load("https://farm6.staticflickr.com/5294/5460063960_1ef2d5c216_o.jpg")
.load("http://i.imgur.com/DvpvklR.png")
.error(R.drawable.ic_error)
.placeholder(R.drawable.progress_image)
.into(iv_sample);
}
private void setGoogleMapData() {
MarkerData markerData_1 = new MarkerData();
markerData_1.setTitle("Current Location");
markerData_1.setSnippet("JobSquare");
markerData_1.setLatLng(new LatLng(23.007809, 72.508872)); // Current Location
markerData_1.setProfilePicUrl("https://imgur.com/t/profile_picture/JfImhgO");
// markerData_1.setProfilePicUrl("http://i.imgur.com/DvpvklR.png");
markerData_1.setPersonName("Ishit Jethwa");
markersDataArrayList.add(markerData_1);
MarkerData markerData_2 = new MarkerData();
markerData_2.setTitle("Manek Chowk");
markerData_2.setSnippet("The eatery");
markerData_2.setLatLng(new LatLng(23.023323, 72.589652)); // Manek Chowk
markerData_2.setProfilePicUrl("https://imgur.com/t/profile_picture/jdl5S");
// markerData_2.setProfilePicUrl("http://i.imgur.com/DvpvklR.png");
markerData_2.setPersonName("Maulik Dodia");
markersDataArrayList.add(markerData_2);
MarkerData markerData_3 = new MarkerData();
markerData_3.setTitle("Science City");
markerData_3.setSnippet("Science home");
markerData_3.setLatLng(new LatLng(23.080292, 72.493599)); // Science City
markerData_3.setProfilePicUrl("https://imgur.com/t/profile_picture/G1O3ns0");
// markerData_3.setProfilePicUrl("http://i.imgur.com/DvpvklR.png");
markerData_3.setPersonName("Piyush Gupta");
markersDataArrayList.add(markerData_3);
MarkerData markerData_4 = new MarkerData();
markerData_4.setTitle("Gujarat High Court");
markerData_4.setSnippet("Court");
markerData_4.setLatLng(new LatLng(23.080483, 72.524387)); // Gujarat High Court
markerData_4.setProfilePicUrl("https://imgur.com/t/profile_picture/rpLiwQv");
// markerData_4.setProfilePicUrl("http://i.imgur.com/DvpvklR.png");
markerData_4.setPersonName("MS Dhoni");
markersDataArrayList.add(markerData_4);
MarkerData markerData_5 = new MarkerData();
markerData_5.setTitle("Neelkanth Patang");
markerData_5.setSnippet("The revolving restaurant");
markerData_5.setLatLng(new LatLng(23.026840, 72.571986)); // Neelkanth Patang
markerData_5.setProfilePicUrl("https://imgur.com/t/profile_picture/yu3gjqw");
// markerData_5.setProfilePicUrl("http://i.imgur.com/DvpvklR.png");
markerData_5.setPersonName("Rahul Dravid");
markersDataArrayList.add(markerData_5);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (int i = 0; i < markersDataArrayList.size(); i++) {
Marker marker = createMarker(markersDataArrayList.get(i).getLatLng(),
markersDataArrayList.get(i).getTitle(),
markersDataArrayList.get(i).getSnippet(),
markersDataArrayList.get(i).getProfilePicUrl(),
markersDataArrayList.get(i).getPersonName());
markerArrayList.add(marker);
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
int padding = (int) (width * 0.20); // offset from edges of the map 10% of screen
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);
mMap.animateCamera(cu);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
protected Marker createMarker(LatLng latLng, String title, String snippet, String profilePicUrl, String personName) {
return mMap.addMarker(new MarkerOptions()
.position(latLng)
.anchor(0.5f, 0.5f)
.title(title)
.snippet(snippet)
.icon(BitmapDescriptorFactory.fromBitmap(
getMarkerBitmapFromView(profilePicUrl, personName))));
}
private Bitmap getMarkerBitmapFromView(String profilePicUrl, String personName) {
View customMarkerView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE))
.inflate(R.layout.layout_map_custom_icon, null);
TextView nameTextView = customMarkerView.findViewById(R.id.tv_name);
CircleImageView markerImageView = customMarkerView.findViewById(R.id.profile_image1);
/*final ImageView markerImageView = customMarkerView.findViewById(R.id.profile_image);*/
Picasso.get()
//.load("https://farm6.staticflickr.com/5294/5460063960_1ef2d5c216_o.jpg")
.load("http://i.imgur.com/DvpvklR.png")
//.load(R.drawable.my_photo)
.error(R.drawable.ic_error)
.resize(100, 100)
.placeholder(R.drawable.progress_image)
.into(markerImageView);
nameTextView.setText(personName);
customMarkerView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
customMarkerView.layout(0, 0, customMarkerView.getMeasuredWidth(), customMarkerView.getMeasuredHeight());
customMarkerView.buildDrawingCache();
Bitmap returnedBitmap = Bitmap.createBitmap(customMarkerView.getMeasuredWidth(),
customMarkerView.getMeasuredHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
canvas.drawColor(Color.WHITE, PorterDuff.Mode.SRC_IN);
Drawable drawable = customMarkerView.getBackground();
if (drawable != null)
drawable.draw(canvas);
customMarkerView.draw(canvas);
return returnedBitmap;
}
}
Изменить Дата: 24 апреля 2019
Поскольку Энди предложил какое-то решение по поводу Пикассо callback
, я попытался реализовать то же самое, но все еще столкнулся с той же проблемой.Я думаю, что я не могу поставить код правильно.Ниже приведен код, который я обновил.
В методе createMarker я обновил приведенный ниже код.
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
protected Marker createMarker(LatLng latLng, String title, String snippet, String profilePicUrl, String personName) {
Marker marker = mMap.addMarker(new MarkerOptions()
.position(latLng)
.anchor(0.5f, 0.5f)
.title(title)
.snippet(snippet)
/*.icon(BitmapDescriptorFactory.fromBitmap(
getMarkerBitmapFromView(profilePicUrl, personName)))*/);
Bitmap bitmap = getMarkerBitmapFromView(profilePicUrl, personName, marker);
marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
return marker;
}
В методе getMarkerBitmapFromView я обновил приведенный ниже код.
Picasso.get()
//.load("https://farm6.staticflickr.com/5294/5460063960_1ef2d5c216_o.jpg")
.load(profilePicUrl)
//.load(R.drawable.my_photo)
.error(R.drawable.ic_error)
.placeholder(R.drawable.progress_image)
.into(markerImageView, new MarkerCallback(marker));
Я создал MarkerCallback
Класс
public class MarkerCallback implements Callback {
private Marker mMarker;
MarkerCallback(Marker marker) {
this.mMarker = marker;
}
@Override
public void onSuccess() {
if (mMarker != null && mMarker.isInfoWindowShown()) {
mMarker.hideInfoWindow();
mMarker.showInfoWindow();
}
}
@Override
public void onError(Exception e) {
Log.e("mk", "onError: " + e.getMessage());
}
}