最近有一个需求,是一个出行类的App,需要在乘客下单后在地图上显示乘客的头像以及司机的头像。
这时候就需要在地图上插上一个marker
ImageLoader.loadLisenter(mContext,headUrl,
imageView);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory
.fromView(imageView1);
LatLng latLng = new LatLng(lat,lon);
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.setFlat(true);
//设置覆盖物比例
markerOptions.anchor(0.5f, 0.5f);
markerOptions.icon(bitmapDescriptor);
markerOptions.position(latLng);
Marker marker = mAmap.addMarker(markerOptions);
marker.setClickable(false);
这样做之后发现,我的Marker并没有显示出来,回头找原因发现我的图片加载用了两种,一种有头像Url时,则调用Glide去异步加载图片。
ImageLoader.load(mContext,url,imageView);
内部使用的Glide
public static void load(Context context, String url, ImageView iv) {
Glide
.with(context)
.load(url)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(iv);
}
第二种是调用本地的资源
imageView.setImageResource(R.mipmap.default_headimg);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory
.fromView(imageView);
LatLng latLng = new LatLng(Double.parseDouble(mOrderDetailsBean.getUp_lat()),
Double.parseDouble(mOrderDetailsBean.getUp_lon()));
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.setFlat(true);
//设置覆盖物比例
markerOptions.anchor(0.5f, 0.5f);
markerOptions.icon(bitmapDescriptor);
markerOptions.position(latLng);
Marker marker = mAmap.addMarker(markerOptions);
marker.setClickable(false);
由于是异步加载,所以在addMarker的时候,图片尚未加载好,所以Marker添加的时候并没有图片,导致无法显示。后发现Glide中有一个监听加载的状态方法,尝试在需要异步加载的时候,监听加载状态,加载完成之后,再进行Marker的添加。最终完美解决了这个问题
public static void loadLisenter(Context context, String url, final ImageView imageView){
Glide.with(context)
.load(url)
.crossFade()
.transform(new CircleTransform(context))
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(new GlideDrawableImageViewTarget(imageView){
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super
GlideDrawable> animation) {
super.onResourceReady(resource, animation);
onLoadAccomplish.accomplish(resource.getCurrent(),imageView);
}
});
}
在ImageLoader封装的这个工具类中,添加了一个接口,在外部调用接口回调,得到加载完成的Resouce。
这个Resouce是GlideDrawable的对象,可以调用getCurrent();方法,得到Drawable对象,从而进行imageView的资源设置
@Override
public void accomplish(Drawable drawable, ImageView imageView) {
ImageView imageView1 = new ImageView(mContext);
LinearLayout.LayoutParams pl = new LinearLayout.LayoutParams(90, 90);
imageView.setLayoutParams(pl);
imageView1.setImageDrawable(drawable);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory
.fromView(imageView1);
LatLng latLng = new LatLng(Double.parseDouble(mOrderDetailsBean.getUp_lat()),
Double.parseDouble(mOrderDetailsBean.getUp_lon()));
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.setFlat(true);
//设置覆盖物比例
markerOptions.anchor(0.5f, 0.5f);
markerOptions.icon(bitmapDescriptor);
markerOptions.position(latLng);
Marker marker = mAmap.addMarker(markerOptions);
marker.setClickable(false);
}
拖了很久才开始写第一篇带了点技术的博客,刚开始写,发现自己并不知道怎么去描述,技术点也比较简单。希望能帮助到一些刚接触Android的小伙伴或者与我一样碰到这个问题的朋友吧。自己还需要多努力。写的不好或者不对的地方,欢迎大家提出来。