使用UiL在谷歌地图标记中加载图像

时间:2016-01-21 07:49:28

标签: android google-maps universal-image-loader

我正在使用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

但是只有默认的drawb R.drawable.profile_image一直在显示。 谁能告诉我,我在这里遗失了什么?代码有什么问题?

2 个答案:

答案 0 :(得分:0)

*你应该创建一个自定义的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;

        }
    });

答案 1 :(得分:0)

根据Dynamic contents in Maps V2 InfoWindow

的一些建议,我找到了问题的解决方案

Android GoogleMap 2 update information dynamically in InfoWindow with ImageView via Universal Image loader

上传代码的问题是getInfoWindow(Marker marker)在下载图片之前被调用,因此它没有显示更新的用户界面。

所以我在下载图像后使用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;
        }

内部类SimpleLoader

@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并使用了http://square.github.io/picasso/ Picasso库。现在它对我来说很好。

谢谢大家。

相关问题