Всплывающее окно CallOut не позиционируется при увеличении/уменьшении масштаба

У меня есть карта Arcgis с булавками. Когда я нажимаю на булавку, я показываю выноску (всплывающее окно) над булавками, которая отлично работает. Но когда я увеличиваю/уменьшаю масштаб карты, выноска не позиционируется относительно булавка на карте. Как я могу всегда показывать выноску поверх булавки при увеличении / уменьшении масштаба.

нажмите на булавку, и появится выноска введите здесь описание изображения

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

Примечание. Я внес изменения в существующий пример проекта приложения карты Arcgis, т.е. /а>

Вот изменения, которые я внес в действие SymbolizingResults.

public class SymbolizingResults extends Activity {

MapView map;
Button queryBtn;
GraphicsLayer gl;
Callout callout;

/** Called when the activity is first created. */

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    map = (MapView) findViewById(R.id.map);
    map.addLayer(new ArcGISTiledMapServiceLayer(
            "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"));

    gl = new GraphicsLayer();
    gl.setRenderer(createClassBreaksRenderer());
    Point p = new Point(37.6922222, -97.3372222);
    HashMap<String, Object> map1 = new HashMap<String, Object>();
    map1.put("NAME", "India");
    PictureMarkerSymbol pic = new PictureMarkerSymbol(this,getResources().getDrawable(R.drawable.pin_dest));
    Graphic gr = new Graphic(p,pic,map1);
    gl.addGraphic(gr);
    map.addLayer(gl);
    queryBtn = (Button) findViewById(R.id.querybtn);

    queryBtn.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // Sets query parameter
            Query query = new Query();
            query.setWhere("STATE_NAME='Kansas'");

            query.setReturnGeometry(true);
            String[] outfields = new String[] { "NAME", "STATE_NAME",
                    "POP07_SQMI" };
            query.setOutFields(outfields);
            query.setOutSpatialReference(map.getSpatialReference());

            Query[] queryParams = { query };

            AsyncQueryTask qt = new AsyncQueryTask();

            qt.execute(queryParams);

        }
    });

    // Sets 'OnSingleTapListener' so that when single tap
    // happens, Callout would show 'SQMI' information associated
    // with tapped 'Graphic'
    map.setOnSingleTapListener(new OnSingleTapListener() {

        private static final long serialVersionUID = 1L;

        public void onSingleTap(float x, float y) {


            if (!map.isLoaded())
                return;

            Point toDroppedPinPoint = map.toMapPoint(x, y);
            System.out.println("X : "+toDroppedPinPoint.getX());
            System.out.println("Y : "+toDroppedPinPoint.getY());

            int[] uids = gl.getGraphicIDs(x, y, 2);
            if (uids != null && uids.length > 0) {

                int targetId = uids[0];
                Graphic gr = gl.getGraphic(targetId);
                callout = map.getCallout();

                // Sets Callout style
                callout.setStyle(R.xml.countypop);
               /* String countyName = (String) gr.getAttributeValue("NAME");
                String countyPop = gr.getAttributeValue("POP07_SQMI")
                        .toString();*/
                // Sets custom content view to Callout
                callout.setContent(loadView("Anshul", "India"));
                callout.show(map.toMapPoint(new Point(x, y)));
            } else {
                if (callout != null && callout.isShowing()) {
                    callout.hide();
                }
            }

        }
    });

}

// Creates custom content view with 'Graphic' attributes
private View loadView(String countyName, String pop07) {
    View view = LayoutInflater.from(CalloutSampleActivity.this).inflate(
            R.layout.sqmi, null);

    final TextView name = (TextView) view.findViewById(R.id.county_name);
    name.setText(countyName + "'s SQMI");

    final TextView number = (TextView) view.findViewById(R.id.pop_sqmi);
    number.setText(pop07);

    final ImageView photo = (ImageView) view
            .findViewById(R.id.family_photo);
    photo.setImageDrawable(CalloutSampleActivity.this.getResources()
            .getDrawable(R.drawable.family));

    return view;

}`

person anshul    schedule 13.12.2013    source источник


Ответы (2)


Проблема в этой строке:

callout.show(map.toMapPoint(new Point(x, y)));

Здесь вы говорите, что хотите показать выноску в том месте, куда нажал пользователь. Это то, что делает образец, и в образце это всегда имеет смысл, потому что вся графика образца представляет собой полигоны (т. е. округа в Канзасе).

Но для точки, такой как булавка, которую вы добавили, вы не хотите показывать выноску в точке касания. Если точка касания находится в паре пикселей от булавки, а затем вы уменьшаете масштаб, разница может составлять сотни миль! Вместо этого вы хотите показать выноску в точке изображения булавки. Но вы хотите сделать это только в том случае, если это на самом деле точка, поэтому вам нужно проверить геометрию графика с помощью instanceof.

Я заменил приведенную выше строку на эту, и она работает:

Geometry graphicGeom = gr.getGeometry();
if (graphicGeom instanceof Point) {
    callout.show((Point) graphicGeom);
} else {
    callout.show(toDroppedPinPoint);
}
person Gary Sheppard    schedule 27.12.2013
comment
Большое спасибо Гэри. Мои 50 баллов — ваши. Пожалуйста, помогите мне и в этом forums.arcgis.com/threads/ - person anshul; 27.12.2013

Я не мог видеть код о том, как вы увеличиваете и уменьшаете масштаб. Но логически вы должны обновить позицию выноски при увеличении и уменьшении масштаба, как вы делаете в onSingleTap().

person Tabrej Khan    schedule 25.12.2013
comment
Это пример кода из Arcgis, в который я внес изменения. Но логику обновления выноски при увеличении/уменьшении масштаба я тоже пробовал, но безуспешно. - person anshul; 26.12.2013