Вопрос по – Карта Blackberry с пользовательскими изображениями в виде событий pin и click

4

Я хочу отобразить карту (либо карту Google, либо Blackberry MapField) в своем приложении с изображением профиля пользователя в качестве маркеров. Также я хочу нажать на булавки, тогда он покажет окно предупреждения. Как это сделано ?. Заранее спасибо.

Я хочу так -

enter image description here

Я попробовал этот код -

import net.rim.blackberry.api.browser.Browser;
import net.rim.blackberry.api.browser.BrowserSession;
import net.rim.device.api.browser.field2.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.container.*;

public class App extends UiApplication
{
public static void main(String[] args)
{
    App app = new App();
    app.enterEventDispatcher();
}
public App()
{
    pushScreen(new MultiplePoints());
}
}
     class MultiplePoints extends MainScreen{
        String initial = "<!DOCTYPE html>\r\n" +
                "<html> \r\n" +
                "<head> \r\n" +
                "  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" /> \r\n" +
                "  <title>Google Maps Multiple Markers</title> \r\n" +
                "  <script src=\"http://maps.google.com/maps/api/js?sensor=false\" \r\n" +
                "          type=\"text/javascript\"></script>\r\n" +
                "</head> \r\n" +
                "<body>\r\n" +
                "  <div id=\"map\" style=\"width: 500px; height: 400px;\"></div>\r\n" +
                "\r\n" +
                "  <script type=\"text/javascript\">\r\n" +
                "    var locations = [";
        String second= " ];\r\n" +
                "\r\n" +
                "    var map = new google.maps.Map(document.getElementById('map'), {\r\n" +
                "      zoom: 8,";
        String centerPoint ="";
        String finalpart = " mapTypeId: google.maps.MapTypeId.ROADMAP\r\n" +
                "    });\r\n" +
                "\r\n" +
                "    var infowindow = new google.maps.InfoWindow();\r\n" +
                "\r\n" +
                "    var marker, i;\r\n" +
                "\r\n" +
                "    for (i = 0; i < locations.length; i++) {  \r\n" +
                "      marker = new google.maps.Marker({\r\n" +
                "        position: new google.maps.LatLng(locations[i][2], locations[i][2]),\r\n" +
                "        map: map\r\n" +
                "      });\r\n" +
                "\r\n" +
                "      google.maps.event.addListener(marker, 'click', (function(marker, i) {\r\n" +
                "        return function() {\r\n" +
                "          infowindow.setContent(locations[i][0]);\r\n" +
                "          infowindow.open(map, marker);\r\n" +
                "        }\r\n" +
                "      })(marker, i));\r\n" +
                "    }\r\n" +
                "  </script>\r\n" +
                "</body>\r\n" +
                "</html>";
        String[] lt={"12.966085","12.944337","12.925599"};
      String[] lon={"77.533264","77.549400","77.594719"};
      String[] name={"vijyanagar","Banashankari","jaynagar"};

      MultiplePoints(){//StringBuffer html,Vector waypoints,LocationObj center){
            StringBuffer html=new StringBuffer();
            html.append(initial);        
            for(int i=0 ; i<lt.length; i++){
                //LocationObj source = (LocationObj)waypoints.elementAt(i);
                //String point = "['"+source.getLabel()+"',"+source.getLatitude()+","+ source.getLongitude()+","+i+"],";
                String point = "['"+name[i]+"',"+lt[i]+","+ lon[i]+","+i+"],";
                //System.out.println("Point is"+point);
                html.append(point);
            }
            html.append(second);
            centerPoint = "  center: new google.maps.LatLng("+lt[0]+","+lon[0]+"),";    
            html.append(centerPoint);
            html.append(finalpart);
            //System.out.println("Plot is"+html.toString());
            BrowserFieldConfig _bfConfig = new BrowserFieldConfig();        
          _bfConfig.setProperty(BrowserFieldConfig.NAVIGATION_MODE,BrowserFieldConfig.NAVIGATION_MODE_POINTER);
          _bfConfig.setProperty( BrowserFieldConfig.JAVASCRIPT_ENABLED, Boolean.TRUE );
         _bfConfig.setProperty(BrowserFieldConfig.USER_AGENT, "MyApplication 1.0");

          BrowserField myBrowserField = new BrowserField(_bfConfig);

          myBrowserField.displayContent(html.toString(), "http://localhost");
          HorizontalFieldManager horf=new HorizontalFieldManager(HORIZONTAL_SCROLL);
          horf.add(myBrowserField);
          add(horf);
        }
    }

Тогда я получаю вот так -

enter image description here

Я попробовал ваш код, но я не получил карту и пин-код в симуляторе 9550, это устройство только для работы? Hasmukh
@ Хасмух нет. его работы в симуляторе также. Пин по умолчанию. Signare
спасибо позвольте мне проверить это в устройстве .. Hasmukh
он отображает только карту, он не отображает контакты на карте. Hasmukh
привет, у вас экран пин-код по умолчанию или кастом? Hasmukh

Ваш Ответ

1   ответ
1
Custom Map Markers

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

Это решение в основном отменяетpaint() метод в классе, который подклассы встроенногоMapField учебный класс. внутриpaint(), он преобразует координаты широты и долготы точки, где вы хотите маркер (значок или значок), вx,y координатыMapField, Затем он вручную рисует маркер сGraphics.drawBitmap().

Теперь, чтобы нарисовать конкретный маркер, который вы показываете выше ... похоже, ваше пользовательское изображение должно состоять из двух частей:

A background marker that you reuse for every user. This is the blue circle with a point at the bottom, that you show in your question. Draw that marker yourself in a drawing program, save it as a .png file, and add it to your project as a bitmap resource.

The second part is the dynamic image of each user. You'll have to download those images yourself (you didn't really specify where those images come from). But, I'm sure you can find examples on stackoverflow of downloading an image from a web server.

Чтобы сделать полный маркер, вы будете использовать техникупоказано в первой ссылке, которую я предоставил, Однако вместо рисованияone Изображение для каждой локации на карте вы нарисуетеtwo, Сначала нарисуйте синий фоновый маркер, который одинаков для каждого пользователя. Затем поверх этого вы нарисуете изображение профиля пользователя. Если вы просто позвонитеdrawBitmap() с изображением пользователяafter рисуя синий маркерный фон, пользовательское изображение будетon top.

Последний трюк, который вам нужен, чтобы сделать эту работу, - это взять изображения профиля пользователя, которые почти наверняка даны вам в виде квадратных изображений, и обрезать их в круглый круг. Для этого вы можете использоватьРешение в этом другом вопросе stackoverflow, В этом решении Рупак определяетcropImage() метод, который делает то, что вам нужно. Он врезается в круг. Внутри этого метода обратите внимание на то, что он делает с переменнойmyImage. myImage в вашем случае начнется как квадратная фотография профиля пользователя. После обрезки,myImage сейчасBitmap объект с обрезанными краями, которые вы должны быть в состоянии передать во второй вызовGraphics.drawBitmap() что вы делаете для каждого местоположения на карте.

Handling User Touches/Clicks

Ваш другой вопрос касался обработки, когда пользователь выбирает маркер. Так как эти «маркеры» просто нарисованы прямо на вершинеMapFieldДля того, чтобы обрабатывать касания / клики по ним, вам, возможно, придется переопределить эти методы в вашемMapField подкласс:

protected boolean touchEvent(TouchEvent message);

protected boolean navigationClick(int status, int time);
protected boolean navigationMovement(int dx, int dy, int status, int time);

В этих методах вы определяете поле(x,y) местоположение касания / щелчка пользователя, а затем циклически переключаться между вашими местоположениями, чтобы определить, было ли касание в пределах определенного(x,y) расстояние маркера. Вы можете сделать это либо в координатах поля (x, y), либо в координатах карты / мира (широта, долгота).MapField имеет методы для конвертации:

void convertFieldToWorld(XYPoint fieldIn, Coordinates worldOut);
void convertWorldToField(Coordinates worldIn, XYPoint fieldOut);

чтобы помочь с этим.

Вы также должны посмотреть наMapFieldDemo который находится подsamples directory в вашей установке JDE. Оно имеетDemoMapField класс, который может помочь в определении местоположения щелчка (если вы не на устройстве с сенсорным экраном):

protected boolean navigationMovement(int dx, int dy, int status, int time) 
{
    // The map is shifted in relation to the current zoom level.
    int zoom = getZoom();
    int latitude = getLatitude() - ((dy << 3) << zoom);     // << 3 is equivalent to multiplication by 8.
    int longitude = getLongitude() + ((dx << 3) << zoom);                  

    moveTo(latitude, longitude);       

    return true;        
}

Удачи!

Похожие вопросы