Как динамически рисовать фигуру на карте, касающейся местоположения в Android

Я хочу нарисовать фигуру, где бы пользователь ни касался карты, она должна рисоваться динамически. Я понятия не имею, как рисовать эти фигуры. Как я мог этого добиться? Могу ли я сделать это через холст? Я использую MapFragment.

Пожалуйста, смотрите изображение,

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

Пожалуйста, дайте мне любую идею! Любая помощь приветствуется!


person Mahe    schedule 07.06.2013    source источник
comment
Никто не знает об этом? Любой пожалуйста!!   -  person Mahe    schedule 07.06.2013


Ответы (3)


Вы можете сделать это, добавив View на карту.

  • иметь объект Polyline (изначально пустой), который будет вашей строкой
  • обрабатывать onTouchEvent на этом View
  • перевести x, y из событий в LatLng с помощью Projection
  • добавить новую точку в Polyline

Готово.

Обратите внимание, что это потребляет все события, которые в противном случае вызвали бы панорамирование или масштабирование карты. У вас должен быть какой-то другой способ взаимодействия с картой или включить использование событий с использованием какого-либо флага.

person MaciejGórski    schedule 07.06.2013
comment
Спасибо. Я пойду с этим. Надеюсь, это поможет. - person Mahe; 07.06.2013
comment
@Mahe решили это? если да, не могли бы вы поделиться своим кодом, пожалуйста? Я хочу сделать то же самое. - person Eman87; 05.08.2013
comment
@ Eman87, я ответил на твой вопрос и разместил свой код. Надеюсь, что это будет полезно для вас. - person Mahe; 05.08.2013

  1. Добавьте ImageView поверх карты. Вы не можете рисовать на карте.
  2. ImageView должен реализовать «OnTouchListener».
  3. Добавьте любую кнопку на карту, чтобы вывести ImageView на передний план, и карта будет видна на фоне. 4. При касании ImageView выполните следующее действие.

    public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    Point p = new Point();
    path = new Path();
    float upX;
    float upY;
    
    switch (action) {
    case MotionEvent.ACTION_DOWN:
        laArray = "";
        lnArray = "";
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
        downx = event.getX();
        downy = event.getY();
        eventX = downx;
        eventY = downy;
        Log.d("", "startx" + eventX);
        p.x = (int) downx;
        p.y = (int) downy;
        LatLng latlngpoint;
        latlngpoint = map.getProjection().fromScreenLocation(p);
        break;
    case MotionEvent.ACTION_MOVE:
        upx = event.getX();
        upy = event.getY();
        canvas.drawLine(downx, downy, upx, upy, paint);
        drawable.invalidate();
        downx = upx;
        downy = upy;
        Log.d("", "Action_Move");
        Log.d("", "downx, downy: " + downx + "," + downy);
        Log.d("", "upx, upy: " + upx + "," + upy);
        p.x = (int) upx;
        p.y = (int) upy;
        LatLng latlngpoint1;
        latlngpoint1 = map.getProjection().fromScreenLocation(p);           
        break;
    case MotionEvent.ACTION_UP:
        upX = event.getX();
        upY = event.getY();
        p.x = (int) upX;
        p.y = (int) upY;
        Log.d("", "Action Up");
        canvas.drawLine(eventX, eventY, upX, upY, paint);
        LatLng latlngpoint2;
        latlngpoint2 = map.getProjection().fromScreenLocation(p);           
        drawable.invalidate();
    
        // When finger is Up, Start UserSearch.
    
        StartUserSearch(); //user defined function
        return true;
    case MotionEvent.ACTION_CANCEL:
        break;
    default:
        break;
    }
    
    return true;
    

    }

Добавьте ImageView, как это,

   <ImageView
    android:id="@+id/viewOnMap"
    style="@style/AppTheme"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    >

  </ImageView> 

поэтому, когда нажимается кнопка рисования на карте,

 ImageView drawable= (ImageView) findViewById(R.id.viewOnMap);
 drawable.setVisibility(View.VISIBLE);
 drawable.bringToFront();

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

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

person Mahe    schedule 05.08.2013
comment
Большое спасибо за ваш ответ. У меня есть вопрос. Когда вы вернетесь к карте и перетащите ее, чтобы показать любое другое место, будет ли нарисованная линия двигаться вместе с картой или она все еще останется на своем месте, а карта перемещается под ней? - person Eman87; 05.08.2013
comment
@ Eman87, когда я возвращаюсь к карте, я очищаю нарисованную линию. Когда пользователь меняет свое местоположение для поиска, и если пользователь хочет выполнить поиск в этом месте, пользователь снова нажимает кнопку рисования на карте, и пользователю разрешается рисовать в imageView. - person Mahe; 05.08.2013
comment
какая польза от переменной laArray, я получаю сообщение об ошибке. - person jyomin; 21.11.2013
comment
@jyomin Я использую эту переменную для хранения всех значений широты и долготы, которые попадают в нарисованную форму. Мой поиск основан на этом массиве. Мне нужен массив долготы и широты. - person Mahe; 21.11.2013
comment
Я реализовал ваш метод onTouch, но в изображении ничего не рисуется. Пожалуйста, помогите - person jyomin; 22.11.2013

Ответ: вы не можете.

Как видите, этот жест будет использоваться картой для действия pan/scroll.

Но есть трюк.

  • Вы можете поместить маркер на действие пользователя (долгое нажатие на карте)
  • Установите перетаскиваемый маркер и установите прослушиватель перетаскивания
  • Предложить пользователю перетащить маркер
  • Слушатель перетаскивания будет потреблять перетаскиваемые точки, когда пользователь перетаскивает маркер.
  • на концах перетаскивания создайте путь с широтой и долготой и нарисуйте путь
  • Удалите маркер.
person Mahendran    schedule 07.06.2013