4

ユーザー プロファイルの写真をマーカーとしてアプリケーションにマップ (Google マップまたは Blackberry MapField のいずれか) を表示したいと考えています。また、ピンをクリックすると、アラート ボックスが表示されます。どのように行われたのですか?前もって感謝します。

私はこのようにしたい -

ここに画像の説明を入力

私はこのコードを試しました -

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);
        }
    }

それから私はこのようになります -

ここに画像の説明を入力

4

1 に答える 1

1

カスタム マップ マーカー

BlackBerry の を使用したい場合はMapFieldまずこの を読んで、MapField.

paint()そのソリューションは基本的に、組み込みクラスをサブクラス化するクラスのメソッドをオーバーライドしますMapField。内部paint()では、マーカー (別名ピンまたはアイコン) が必要なポイントの緯度と経度の座標を のx、y座標に変換しMapFieldます。次に、 でマーカーを手動で描画しますGraphics.drawBitmap()

ここで、上に示した特定のマーカーを描画するには、カスタム イメージを次の 2 つの部分で構成する必要があるようです。

  1. すべてのユーザーに再利用する背景マーカー。これは、質問に表示される、下部に点がある青い円です。そのマーカーを描画プログラムで自分で描画し、.png ファイルとして保存して、ビットマップ リソースとしてプロジェクトに追加します。

  2. 2 番目の部分は、各ユーザーの動的なイメージです。これらの画像を自分でダウンロードする必要があります (これらの画像がどこから来たのかを実際に指定していませんでした)。しかし、Web サーバーから画像をダウンロードする例は、stackoverflow で見つけることができると思います。

完全なマーカーを作成するには、私が提供した最初のリンクに示されている手法を使用します。ただし、マップ上の場所ごとに1 つのイメージを描画する代わりに、 2 つの を描画します。まず、すべてのユーザーに同じ青色の背景マーカーを描画します。その上に、ユーザーのプロフィール画像を描画します。青いマーカーの背景を描画した、ユーザー画像で単純に呼び出すdrawBitmap()と、ユーザー画像が一番上になります。

これを機能させるために必要な最後のトリックは、ほぼ確実に正方形の画像として提供されるユーザー プロファイル画像を取得し、それらを丸い円にトリミングすることです。これを行うには、この他のスタックオーバーフローの質問のソリューションを使用できます。そのソリューションでは、Rupak はcropImage()必要なことを行うメソッドを定義します。彼は円に切り取ります。そのメソッド内で、彼が変数に対して行うことに注意してmyImageください。 myImageあなたの場合、正方形のユーザープロフィール写真として始まります。トリミング後、myImageはトリミングされたエッジを持つオブジェクトになり、マップ上の各場所に対して行うBitmapの 2 番目の呼び出しに渡すことができるはずです。Graphics.drawBitmap()

ユーザーのタッチ/クリックの処理

あなたの他の質問は、ユーザーがマーカーを選択したときの処理についてでした。これらの「マーカー」は の上に直接描画されるだけなので、それらのタッチ/クリックを処理するには、サブクラス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);

これを助けるために。

また、JDE インストールサンプルディレクトリにあるMapFieldDemo も確認する必要があります。クリックの位置を取得するのに役立つクラスがあります (タッチスクリーン デバイスを使用していない場合)。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;        
}

幸運を!

于 2012-06-04T08:21:51.227 に答える