Как показать как MarkerIcon, так и заголовок на карте Google, как в Google Apps?

Когда я нахожу ближайшие рестораны в приложении Google Maps для Android, название ресторана по умолчанию отображается рядом со значком маркера. (См. Изображение Google).

Но в моем приложении мне нужно сделать то же самое, когда я ищу ближайшие рестораны, я могу отображать только значки маркеров. (См. изображение моего приложения).

Изображение Google:

Изображение Google

Мое изображение приложения:

Мое изображение приложения

Частичное решение: здесь я нашел частичное решение для этого, мы получаем это, рисуя текст с помощью холста. Я использовал приведенный ниже код, ссылаясь на эти ссылки здесь и здесь Но рисунок на холсте вырезал из моего текста. Обратитесь к прикрепленному изображению TextDrawn Image

Marker myLocMarker = map.addMarker(new MarkerOptions()
            .position(myLocation)
            .icon(BitmapDescriptorFactory.fromBitmap(writeTextOnDrawable(R.drawable.bluebox, "your text goes here"))));

    private Bitmap writeTextOnDrawable(int drawableId, String text) {

            Bitmap bm = BitmapFactory.decodeResource(context.getResources(), drawableId)
                    .copy(Bitmap.Config.ARGB_8888, true);

            Paint paint = new Paint();
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.BLACK);
            paint.setTextAlign(Paint.Align.CENTER);
            paint.setLinearText(true);
            paint.setAntiAlias(true);
            paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));

            paint.setTextSize(35);

            Rect textRect = new Rect();
            paint.getTextBounds(text, 0, text.length(), textRect);

            Canvas canvas = new Canvas(bm);


            //Calculate the positions
    //        int xPos = (canvas.getWidth() / 2) - 2;     //-2 is for regulating the x position offset

            //"- ((paint.descent() + paint.ascent()) / 2)" is the distance from the baseline to the center.
    //        int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ;

            canvas.drawText(text, canvas.getHeight() + 2, canvas.getHeight() + 2, paint);

            return  bm;
        } 

Текстовое изображение:


person Naveen Kumar M    schedule 03.09.2016    source источник
comment
Вы можете получить эти данные из Google Places API... Взгляните на него.   -  person Akhil Soman    schedule 03.09.2016
comment
Да, я использовал Google Places API, только я уже отображал маркеры. Мой вопрос: как отображать имя вместе со значками маркеров, как Google Image, о котором я упоминал?   -  person Naveen Kumar M    schedule 03.09.2016
comment
Возможно, вам поможет следующий пост. binwaheed.blogspot.com.es/ 2011/05/   -  person xomena    schedule 05.09.2016
comment
@xomena canvas.drawText не рисует полный текст, вы можете помочь решить эту проблему? Проверьте обновленный вопрос.   -  person Naveen Kumar M    schedule 07.09.2016
comment
Не уверен, что это сработает, но пробовали ли вы изменить paint.setTextSize(35); на другие значения?   -  person Flame_Phoenix    schedule 08.09.2016
comment
Еще одна вещь, которая может помочь, — это размер значка. Проверьте этот вопрос stackoverflow.com/questions/35718103/   -  person Flame_Phoenix    schedule 08.09.2016
comment
@Flame_Phoenix Изменение размера здесь не работает Canvas canvas = new Canvas(bm); Таким образом, холст доступен только для размера растрового изображения, поэтому для ширины растрового изображения рисуется только текст, который не распространяется на исходную ширину текста. Но здесь слишком длинный текст означает, что нет смысла увеличивать ширину растрового изображения.   -  person Naveen Kumar M    schedule 08.09.2016
comment
если вы используете Google Places API, то вы наверняка получите изображение и значки для каждой долготы, поэтому используйте это изображение, и вы получите экран, как приложение Google Maps для Android.   -  person Nikhil Singh    schedule 12.09.2016
comment
Да, Нихил, я использую API Google Places только для поиска поблизости. Я получаю значок и имя в результате. Как установить этот результат на карту? Не могли бы вы уточнить?   -  person Naveen Kumar M    schedule 12.09.2016


Ответы (5)


Существует несколько источников значков, и Places API предоставляет достаточно подробностей, чтобы вы могли выбрать правильный значок для каждого места. Я не знаком с Android, поэтому я лишь слегка коснусь этого.

Я бы сказал, что сегодня дело в том, чтобы найти надежный набор значков, с которым можно работать.

  1. Самым безопасным вариантом могут быть собственные значки Place API. По крайней мере, в веб-службе каждое место в виде поля icon указывает на URL-адрес. Будучи частью поддерживаемого API, я чувствовал бы себя наиболее комфортно, полагаясь на эти значки, за исключением наличия собственных значков. Вот для баров:

введите здесь описание изображения

  1. Если они вам нравятся и вы не возражаете, что однажды они могут исчезнуть без предварительного уведомления, вы можете использовать устаревший API Chart Отдельно стоящие значки. По крайней мере, эти изменятся только один раз: с доступных на недоступные. Хотя выглядят они не очень хорошо:

введите здесь описание изображения

  1. Если вам действительно нужны те же значки, которые используются в результатах поиска Google Maps, и вам нравится жить на грани, вы можете взломать их URL-адреса из Google Maps. Осторожно: они могут измениться в любое время, так что однажды вы можете проснуться без значков! ─ и может меняться часто, а не один раз.

введите здесь описание изображения

Однако, если вы используете Places API для Android, я могу предположить, что вы ищете решение, основанное на веб-службе Places API.

Похоже, что у объекта Place нет getIcon() или чего-то подобного, поэтому вам нужно придумать собственное сопоставление на основе вывода getPlaceTypes() на значки. Я думаю, было бы разумно попросить Google добавить getIcon() метод, который сделает это за вас, поэтому я рекомендую запрос функции для него.

person miguev    schedule 09.09.2016
comment
Спасибо, что поделились ссылкой на запрос функции. Здесь проблема не в Icons. Мне нужно отобразить заголовок вместе со значком. - person Naveen Kumar M; 09.09.2016
comment
Ах, тогда вы можете подать 2 запроса на добавление функций :) - person miguev; 09.09.2016

Попробуйте с пользовательским маркером карты. Вы можете создать собственное представление и установить для него маркер.

Шаг 1. Создайте собственный файл макета в соответствии с вашими потребностями и раздуйте его.

 View customMarker = LayoutInflater.from(getApplicationContext()).inflate(R.layout.custom_marker, null);

Шаг 2. Преобразование пользовательского представления в растровое изображение.

public static Bitmap createDrawableFromView(Context context, View view) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels);
        view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);
        view.buildDrawingCache();
        Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
        return bitmap;
    }
Bitmap customeViewBitmap = createDrawableFromView(context, customMarker);

Шаг 3. Создайте маркер с полученным растровым изображением и добавьте его в объект карты Google.

GoogleMap googleMap = googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(
                    R.id.map)).getMap();
googleMap.addMarker(new MarkerOptions()
                    .position(latLng)                    .icon(BitmapDescriptorFactory.fromBitmap(customeViewBitmap)));

Шаг 4. Добавьте прослушиватель MarkerClick

googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    //Your logic here
                    return false;
                }
            });
person Pandiarajan    schedule 12.09.2016
comment
Где текст нарисован на холсте. Мой вопрос заключается в том, чтобы отображать как маркер, так и текст на карте, например, в приложении Google Map. Здесь текст будет отображаться только при событии щелчка для соответствующего маркера. - person Naveen Kumar M; 13.09.2016
comment
Просмотр customMarker = LayoutInflater.from(getActivity()).inflate(R.layout.custom_marker, null); final ImageView markerIcon = (ImageView) customMarker.findViewById(R.id.map_marker); окончательный TextView markerText = (TextView) customMarker.findViewById(R.id.marker_text); markerIcon.setImageResource(R.drawable.ic_media_play); markerText.setText(Название ресторана); Растровое изображение customViewBitmap = createDrawableFromView(getActivity(), customMarker); LatLng latLng = новый LatLng(13.0169961,80.2042327); - person Pandiarajan; 13.09.2016
comment
mMap.addMarker(new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromBitmap(customViewBitmap))); - person Pandiarajan; 13.09.2016
comment
Вы должны создать собственный макет представления. Где вы можете поместить изображение и текстовое представление. ‹Relativelayout›‹ImageView›‹/ImageView›‹TextView android:layout_toRightOf=ImageView›‹/TextView›‹/Relativelayout› - person Pandiarajan; 13.09.2016
comment
Приведенный выше ответ будет работать без использования ClusterManager, но в моей реализации я использовал ClusterManager. Итак, как это сделать. Здесь я могу вставить код, пожалуйста, обратитесь. paste.org/81472 - person Naveen Kumar M; 15.09.2016
comment
1. Вы должны надуть custom_m‌arker внутри конструктора CustomIconRendered. 2. onBeforeClusterItemRendered вы должны установить для рисования изображение, а заголовок/описание - текстовое представление. 3. Преобразуйте представление customMarker в растровое изображение и добавьте его в параметры маркера. - person Pandiarajan; 15.09.2016
comment
private final View customMarker;public CustomIconRendered(контекстный контекст, карта GoogleMap,ClusterManager‹MarkerObject› clusterManager) {super(context, map, clusterManager);this.context = context;customMarker = LayoutInflater.from(context).inflate(R.layout .custom_marker, ноль);} - person Pandiarajan; 15.09.2016
comment
protected void onBeforeClusterItemRendered (элемент MarkerObject, MarkerOptions markerOptions) { ImageView markerIcon = (ImageView) customMarker.findViewById (R.id.map_marker); окончательный TextView markerText = (TextView) customMarker.findViewById(R.id.marker_text); markerIcon.setImageResource(item.getImagetResource()); markerText.setText(item.getTitle()); Bitmap customViewBitmap = createDrawableFromView(getActivity(), customMarker);markerOptions.icon(BitmapDescriptorFactory.fromBitmap(customeViewBitmap));} - person Pandiarajan; 15.09.2016

Это не маркеры. Я полагаю, что они добавлены в базу данных Google Адресов с помощью Добавить места. API.

Я могу предложить вам извлекать результат из мест и использовать эти результаты как title при добавлении Markers.

person adjuremods    schedule 06.09.2016
comment
Я уже получаю результаты Places с помощью API maps.googleapis.com/maps/api/place/nearbysearch. Алос, я добавил маркеры, согласно документу Google, здесь заголовок отображается только при нажатии для маркера. Но на карте Google, отображающей заголовки с маркерами, на самом деле текст нарисован на карте. Итак, как это сделать? - person Naveen Kumar M; 06.09.2016
comment
Ваше предложение хорошее, но как его использовать в собственных приложениях для Android? В веб-приложении только его работа - person Naveen Kumar M; 06.09.2016
comment
Извините, я забыл, что это на Android. Я считаю, что приложение Google Maps по-прежнему использует пользовательские маркеры для своих ресторанов, и другие интересные места. Вы можете просто использовать те же принципы дизайна, которые показаны, когда вы хотите добавить маркер ресторана. Надеюсь, это немного поможет вам. - person adjuremods; 06.09.2016
comment
В моем пользовательском случае у меня есть различные значки, связанные с ресторанами. например, кафе, еда_доставка, бар, пекарня и т. д.. для каждого из них я показываю разные значки маркеров. Я считаю, что лучше отображать имя со значками, как карты Google в Android. Я думаю, что они рисуют текст вместе со значком, используя холст. - person Naveen Kumar M; 06.09.2016
comment
Предлагается здесь вызывать showInfoWindo(). Они также указали различные способы отображения заголовка. - person adjuremods; 06.09.2016
comment
Это хорошо, но я использую clustermanager, я не могу использовать это. Мне нужно было точно так же, как Google, как указано в моем снимке экрана с вопросом (изображение Google) - person Naveen Kumar M; 06.09.2016

Мой подход к вашей ситуации будет заключаться в использовании динамических значков из Google Maps.

Возможно, она устарела, но на данный момент я не знаю лучшей альтернативы. С помощью этой библиотеки вы сможете создавать булавки со значками и буквами внутри, что, я считаю, именно то, что вам нужно.

Например, следующая ссылка

https://chart.googleapis.com/chart?chst=d_map_spin&chld=2.1|35|FFFF88|11|_|A|Balloon!

создаст следующее изображение

воздушный шар

Библиотека обширна и имеет множество опций, это только верхушка айсберга.

Надеюсь, поможет!

person Flame_Phoenix    schedule 07.09.2016
comment
Я думаю, что это невозможно для андроида. Библиотека принадлежит веб-приложению - person Naveen Kumar M; 08.09.2016
comment
@NaveenKumarM Это возможно на 100% для любого приложения, способного выполнять веб-запрос. Андроид включен. Выполнив запрос по описанной ссылке, API Google в результате выдаст вам изображение. Вы можете использовать его. Еще один способ увидеть это - вы можете иметь маркеры в своем приложении, вы также можете иметь это. - person Flame_Phoenix; 08.09.2016
comment
Спасибо, Flame, но я не хочу менять иконки здесь. Мне также нужны мои настраиваемые значки. А также делать веб-запрос значков каждый раз, когда это не очень хорошая практика. - person Naveen Kumar M; 08.09.2016
comment
@NaveenKumarM Что ж, я согласен с тем, что делать запрос GET каждый раз, когда вы хотите отобразить значок, излишне, если у вас сотни ресторанов. - person Flame_Phoenix; 08.09.2016
comment
Остерегайтесь: хотя эти динамические значки хороши, они могут исчезнуть в любой день. Если вы просто прокрутите вверх, вы увидите Предупреждение: этот API устарел. Вместо этого используйте активно поддерживаемый API Google Charts. красный баннер вверху. - person miguev; 09.09.2016
comment
@miguev Я упоминаю об этом в своем ответе. Если вы знаете лучший вариант, не стесняйтесь упоминать его. - person Flame_Phoenix; 09.09.2016

После нескольких дней исследований я закончил с этим решением. Мы можем установить ваш собственный макет IconGenerator

 View marker = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_marker_layout, null);
    TextView numTxt = (TextView) marker.findViewById(R.id.num_txt);
    numTxt.setText("Naveen");

    final IconGenerator mIconGenerator = new IconGenerator(getApplicationContext());
    mIconGenerator.setContentView(marker);
    Bitmap icon = mIconGenerator.makeIcon();
    customMarker = mMap.addMarker(new MarkerOptions()
            .position(markerLatLng)
            .title("Title")
            .snippet("Description")
            .icon(BitmapDescriptorFactory.fromBitmap(icon))
            .anchor(0.5f, 1));

Пользовательский маркер карты

person Naveen Kumar M    schedule 26.09.2016