使用 UiL 未在 google 地图标记中加载图像
Image not loading in google map marker using UiL
我正在使用 universal-image-loader-1.9.5.jar
。我正在尝试在标记上显示用户图像。但是没有显示图像。
我做了什么。
UIL初始化
imageLoader = ImageLoader.getInstance();
defaultOptions = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.profile_image) // resource or drawable
.showImageForEmptyUri(R.drawable.profile_image) // resource or drawable
.showImageOnFail(R.drawable.profile_image) // resource or drawable
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(1000)
.cacheInMemory(false) // default
.cacheOnDisk(false) // default
.considerExifParams(false) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();
File cacheDir = StorageUtils.getCacheDirectory(this);
config = new ImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 2) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiskCache(cacheDir)) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();
imageLoader.init(config);
使用 InfoWindowAdapter
googleMap.setInfoWindowAdapter(new MyCustomAdapterForItems());
public class MyCustomAdapterForItems implements InfoWindowAdapter {
private final View myContentsView;
MyCustomAdapterForItems() {
myContentsView = mainFragmentActivity.getLayoutInflater().inflate(
R.layout.map_info_window_dialog, null);
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
@Override
public View getInfoWindow(Marker marker) {
try {
JSONObject jsonMarker = new JSONObject(marker.getSnippet());
String name = jsonMarker.getString("name");
double distance = jsonMarker.getDouble("distance");
String imagePath = jsonMarker.getString("profile_pic_address");
String gender = jsonMarker.getString("gender");
String birthDate = jsonMarker.getString("birthdate");
age = hiApplication.getAge(birthDate);
TextView tvName = ((TextView) myContentsView
.findViewById(R.id.tvMapChatName));
TextView tvAge = ((TextView) myContentsView
.findViewById(R.id.tvMapChatAge));
TextView tvDistance = ((TextView) myContentsView
.findViewById(R.id.distance));
TextView tvGender = (TextView) myContentsView.findViewById(R.id.tvChatGender);
RoundedImageView image = (RoundedImageView) myContentsView.findViewById(R.id.profile_pic);
imageLoader.displayImage(imagePath, image , defaultOptions , simpleLoader); //Image loading here
tvName.setText(name);
if(age == 0 ) tvAge.setText("");
else tvAge.setText(age+"");
tvGender.setText(gender);
tvDistance.setText(new DecimalFormat("##.##").format(distance)+ " km.");
} catch (JSONException e) {
e.printStackTrace();
}
return myContentsView;
}
}
ImageLoadingListener
private class SimpleLoader implements ImageLoadingListener {
@Override
public void onLoadingCancelled(String arg0, View arg1) {
Log.d("d", "image cancelled");
}
@Override
public void onLoadingComplete(String arg0, View view, Bitmap bitmap) {
Log.d("d", "loading complete");
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(bitmap);
}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
Log.d("d", "image loading failed");
}
@Override
public void onLoadingStarted(String arg0, View arg1) {
Log.d("d", "image loading started");
}
}
尽管我的日志显示图像已完全加载。这是我的日志。
01-21 02:38:13.561: D/d(7832): image loading started
01-21 02:38:13.567: D/ImageLoader(7832): Delay 1000 ms before loading... [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.568: D/ImageLoader(7832): Start display image task [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.569: D/ImageLoader(7832): Load image from network [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.653: D/ImageLoader(7832): Display image in ImageAware (loaded from NETWORK) [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.653: D/d(7832): loading complete
但一直只显示默认绘图 R.drawable.profile_image
。
谁能告诉我,我在这里遗漏了什么吗?代码有什么问题?
*您应该创建一个自定义 xml 布局文件,然后在方法 getInfoContents(Marker arg0)
中膨胀
你的图片已经准备好了,但我认为它没有加载到标记上。
试试这个
@Override
public View getInfoContents(Marker arg0) {
// Getting view from the layout file info_window_layout
View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);
// Getting the position from the marker
LatLng latLng = arg0.getPosition();
// Getting reference to the TextView to set latitude
TextView tvLat = (TextView) v.findViewById(R.id.tv_lat);
// Getting reference to the TextView to set longitude
TextView tvLng = (TextView) v.findViewById(R.id.tv_lng);
// Setting the latitude
tvLat.setText("Latitude:" + latLng.latitude);
// Setting the longitude
tvLng.setText("Longitude:"+ latLng.longitude);
// Returning the view containing InfoWindow contents
return v;
}
});
根据 Dynamic contents in Maps V2 InfoWindow
的一些建议,我找到了问题的解决方案
和Android GoogleMap 2 update information dynamically in InfoWindow with ImageView via Universal Image loader
以上代码的问题是 getInfoWindow(Marker marker)
在下载图像之前被调用,因此它没有显示更新 UI。
所以我在图像下载后使用 marker.showInfoWindow()
和 marker.hideInfoWindow()
更新 infowindow() 。
我对代码进行了以下更改。
@Override
public View getInfoContents(Marker marker) {
if ( FragmentMap.this.marker != null && FragmentMap.this.marker.isInfoWindowShown()) {
FragmentMap.this.marker.hideInfoWindow();
FragmentMap.this.marker.showInfoWindow();
FragmentMap.this.marker = null ;
}
return null;
}
@Override
public View getInfoWindow(Marker marker) {
try {
Log.d("d", "inside getinfowindow");
FragmentMap.this.marker = marker;
JSONObject jsonMarker = new JSONObject(marker.getSnippet());
String name = jsonMarker.getString("name");
double distance = jsonMarker.getDouble("distance");
String imagePath = jsonMarker.getString("profile_pic_address");
String gender = jsonMarker.getString("gender");
String birthDate = jsonMarker.getString("birthdate");
age = hiApplication.getAge(birthDate);
TextView tvName = ((TextView) myContentsView
.findViewById(R.id.tvMapChatName));
TextView tvAge = ((TextView) myContentsView
.findViewById(R.id.tvMapChatAge));
TextView tvDistance = ((TextView) myContentsView
.findViewById(R.id.distance));
TextView tvGender = (TextView) myContentsView.findViewById(R.id.tvChatGender);
RoundedImageView image = (RoundedImageView) myContentsView.findViewById(R.id.profile_pic);
imageLoader.displayImage(imagePath, image , defaultOptions , simpleLoader);
tvName.setText(name);
if(age == 0 ) tvAge.setText("");
else tvAge.setText(age+"");
tvGender.setText(gender);
tvDistance.setText(new DecimalFormat("##.##").format(distance)+ " km.");
} catch (JSONException e) {
e.printStackTrace();
}
return myContentsView;
}
里面classSimpleLoader
@Override
public void onLoadingComplete(String arg0, final View view, Bitmap bitmap) {
markerCustomAdapter.getInfoContents(marker);
}
更新
以上代码在 android 4.0.4 上运行良好,但是当我在 android lolipop 上尝试此代码时,图像无法加载。所以我关注了 Add an Image from url into custom InfoWindow google maps v2 and used http://square.github.io/picasso/ 毕加索图书馆。现在它对我来说工作正常。
谢谢大家
我正在使用 universal-image-loader-1.9.5.jar
。我正在尝试在标记上显示用户图像。但是没有显示图像。
我做了什么。
UIL初始化
imageLoader = ImageLoader.getInstance();
defaultOptions = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.profile_image) // resource or drawable
.showImageForEmptyUri(R.drawable.profile_image) // resource or drawable
.showImageOnFail(R.drawable.profile_image) // resource or drawable
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(1000)
.cacheInMemory(false) // default
.cacheOnDisk(false) // default
.considerExifParams(false) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();
File cacheDir = StorageUtils.getCacheDirectory(this);
config = new ImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 2) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiskCache(cacheDir)) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();
imageLoader.init(config);
使用 InfoWindowAdapter
googleMap.setInfoWindowAdapter(new MyCustomAdapterForItems());
public class MyCustomAdapterForItems implements InfoWindowAdapter {
private final View myContentsView;
MyCustomAdapterForItems() {
myContentsView = mainFragmentActivity.getLayoutInflater().inflate(
R.layout.map_info_window_dialog, null);
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
@Override
public View getInfoWindow(Marker marker) {
try {
JSONObject jsonMarker = new JSONObject(marker.getSnippet());
String name = jsonMarker.getString("name");
double distance = jsonMarker.getDouble("distance");
String imagePath = jsonMarker.getString("profile_pic_address");
String gender = jsonMarker.getString("gender");
String birthDate = jsonMarker.getString("birthdate");
age = hiApplication.getAge(birthDate);
TextView tvName = ((TextView) myContentsView
.findViewById(R.id.tvMapChatName));
TextView tvAge = ((TextView) myContentsView
.findViewById(R.id.tvMapChatAge));
TextView tvDistance = ((TextView) myContentsView
.findViewById(R.id.distance));
TextView tvGender = (TextView) myContentsView.findViewById(R.id.tvChatGender);
RoundedImageView image = (RoundedImageView) myContentsView.findViewById(R.id.profile_pic);
imageLoader.displayImage(imagePath, image , defaultOptions , simpleLoader); //Image loading here
tvName.setText(name);
if(age == 0 ) tvAge.setText("");
else tvAge.setText(age+"");
tvGender.setText(gender);
tvDistance.setText(new DecimalFormat("##.##").format(distance)+ " km.");
} catch (JSONException e) {
e.printStackTrace();
}
return myContentsView;
}
}
ImageLoadingListener
private class SimpleLoader implements ImageLoadingListener {
@Override
public void onLoadingCancelled(String arg0, View arg1) {
Log.d("d", "image cancelled");
}
@Override
public void onLoadingComplete(String arg0, View view, Bitmap bitmap) {
Log.d("d", "loading complete");
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(bitmap);
}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
Log.d("d", "image loading failed");
}
@Override
public void onLoadingStarted(String arg0, View arg1) {
Log.d("d", "image loading started");
}
}
尽管我的日志显示图像已完全加载。这是我的日志。
01-21 02:38:13.561: D/d(7832): image loading started
01-21 02:38:13.567: D/ImageLoader(7832): Delay 1000 ms before loading... [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.568: D/ImageLoader(7832): Start display image task [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.569: D/ImageLoader(7832): Load image from network [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.653: D/ImageLoader(7832): Display image in ImageAware (loaded from NETWORK) [http://192.168.1.9:8080/chatme_userimages/ttestttt@gmail.com.jpg_100x100]
01-21 02:38:14.653: D/d(7832): loading complete
但一直只显示默认绘图 R.drawable.profile_image
。
谁能告诉我,我在这里遗漏了什么吗?代码有什么问题?
*您应该创建一个自定义 xml 布局文件,然后在方法 getInfoContents(Marker arg0)
中膨胀你的图片已经准备好了,但我认为它没有加载到标记上。
试试这个
@Override
public View getInfoContents(Marker arg0) {
// Getting view from the layout file info_window_layout
View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);
// Getting the position from the marker
LatLng latLng = arg0.getPosition();
// Getting reference to the TextView to set latitude
TextView tvLat = (TextView) v.findViewById(R.id.tv_lat);
// Getting reference to the TextView to set longitude
TextView tvLng = (TextView) v.findViewById(R.id.tv_lng);
// Setting the latitude
tvLat.setText("Latitude:" + latLng.latitude);
// Setting the longitude
tvLng.setText("Longitude:"+ latLng.longitude);
// Returning the view containing InfoWindow contents
return v;
}
});
根据 Dynamic contents in Maps V2 InfoWindow
的一些建议,我找到了问题的解决方案和Android GoogleMap 2 update information dynamically in InfoWindow with ImageView via Universal Image loader
以上代码的问题是 getInfoWindow(Marker marker)
在下载图像之前被调用,因此它没有显示更新 UI。
所以我在图像下载后使用 marker.showInfoWindow()
和 marker.hideInfoWindow()
更新 infowindow() 。
我对代码进行了以下更改。
@Override
public View getInfoContents(Marker marker) {
if ( FragmentMap.this.marker != null && FragmentMap.this.marker.isInfoWindowShown()) {
FragmentMap.this.marker.hideInfoWindow();
FragmentMap.this.marker.showInfoWindow();
FragmentMap.this.marker = null ;
}
return null;
}
@Override
public View getInfoWindow(Marker marker) {
try {
Log.d("d", "inside getinfowindow");
FragmentMap.this.marker = marker;
JSONObject jsonMarker = new JSONObject(marker.getSnippet());
String name = jsonMarker.getString("name");
double distance = jsonMarker.getDouble("distance");
String imagePath = jsonMarker.getString("profile_pic_address");
String gender = jsonMarker.getString("gender");
String birthDate = jsonMarker.getString("birthdate");
age = hiApplication.getAge(birthDate);
TextView tvName = ((TextView) myContentsView
.findViewById(R.id.tvMapChatName));
TextView tvAge = ((TextView) myContentsView
.findViewById(R.id.tvMapChatAge));
TextView tvDistance = ((TextView) myContentsView
.findViewById(R.id.distance));
TextView tvGender = (TextView) myContentsView.findViewById(R.id.tvChatGender);
RoundedImageView image = (RoundedImageView) myContentsView.findViewById(R.id.profile_pic);
imageLoader.displayImage(imagePath, image , defaultOptions , simpleLoader);
tvName.setText(name);
if(age == 0 ) tvAge.setText("");
else tvAge.setText(age+"");
tvGender.setText(gender);
tvDistance.setText(new DecimalFormat("##.##").format(distance)+ " km.");
} catch (JSONException e) {
e.printStackTrace();
}
return myContentsView;
}
里面classSimpleLoader
@Override
public void onLoadingComplete(String arg0, final View view, Bitmap bitmap) {
markerCustomAdapter.getInfoContents(marker);
}
更新
以上代码在 android 4.0.4 上运行良好,但是当我在 android lolipop 上尝试此代码时,图像无法加载。所以我关注了 Add an Image from url into custom InfoWindow google maps v2 and used http://square.github.io/picasso/ 毕加索图书馆。现在它对我来说工作正常。
谢谢大家