Tôi hiện đang phát triển một hệ thống theo dõi để vạch ra quỹ đạo chuyển động của người dùng bên trong một căn phòng hoặc điều gì đó.Làm thế nào để vẽ một hình ảnh đánh dấu nhỏ và tiếp tục làm mới vị trí của nó trên hình ảnh bản đồ TÙY CHỈNH của tôi? - Android
Bây giờ tôi đã quản lý để nhập bản đồ của mình vào ứng dụng và bản đồ được phóng to và di chuyển miễn phí. Bước tiếp theo là đặt điểm đánh dấu để cho biết vị trí của người dùng trên bản đồ và di chuyển điểm đánh dấu xung quanh bản đồ. (như nổi trên bản đồ)
Tôi đọc nó ở đâu đó và nghĩ rằng điều này có thể được thực hiện với MyLocationOverlay
, nhưng hầu hết các ví dụ trực tuyến là tất cả để áp dụng nó vào google map
. Tuy nhiên, trong trường hợp của tôi, bản đồ của tôi không phải là google map
, nó là bản đồ OWN của tôi. (Bản đồ có thể là bản đồ của căn phòng của tôi hoặc thậm chí là bản đồ mà tôi vẽ bản thân mình!)
Tôi đã thực hiện thuật toán theo dõi, tức là Tôi biết vị trí đặt hình ảnh đánh dấu là.
Vì vậy, câu hỏi duy nhất vẫn là cách trình bày hình ảnh điểm đánh dấu ở trên cùng của hình ảnh bản đồ.
Cụ thể, tôi có một cái nhìn tự xác định, MapView, như sau:
package com.example.drsystem;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
public class MapView extends View {
private static final int INVALID_POINTER_ID = -1;
private Drawable mImage;
private float mPosX;
private float mPosY;
private float mLastTouchX;
private float mLastTouchY;
private int mActivePointerId = INVALID_POINTER_ID;
private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;
public MapView(Context context) {
this(context, null, 0);
mImage = getResources().getDrawable(R.drawable.lv12n);
mImage.setBounds(0, 0, mImage.getIntrinsicWidth(), mImage.getIntrinsicHeight());
}
// called when XML tries to inflate this View
public MapView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
mImage = getResources().getDrawable(R.drawable.lv12n);
mImage.setBounds(0, 0, mImage.getIntrinsicWidth(), mImage.getIntrinsicHeight());
}
public MapView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final float x = ev.getX();
final float y = ev.getY();
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = ev.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
final float x = ev.getX(pointerIndex);
final float y = ev.getY(pointerIndex);
// Only move if the ScaleGestureDetector isn't processing a gesture.
if (!mScaleDetector.isInProgress()) {
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
invalidate();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = ev.getX(newPointerIndex);
mLastTouchY = ev.getY(newPointerIndex);
mActivePointerId = ev.getPointerId(newPointerIndex);
}
break;
}
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
Log.d("MapView", "X: " + mPosX + " Y: " + mPosY);
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
mImage.draw(canvas);
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
invalidate();
return true;
}
}
}
Lên đến đây, bản đồ là thành công đầu vào vào ứng dụng, và nó là cả di chuyển và Zoomable.
Và sau đó, tôi chèn giao diện tùy chỉnh này vào tệp XML bố trí như sau:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MapView" >
<com.example.drsystem.MapView
android:id="@+id/mapView1"
android:layout_width="fill_parent"
android:layout_height="400dp"
android:layout_above="@+id/button2"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
...
</RelativeLayout>
Dựa trên tất cả thông tin này, làm thế nào có thể tôi vẽ một dấu chấm và liên tục cập nhật vị trí của nó trên bản đồ của tôi?
Cập nhật:
Câu hỏi đặt ra chỉ đơn giản về việc đưa một hình ảnh nhỏ trên đầu trang của một giao diện tùy chỉnh và di chuyển nó xung quanh là.
Tôi cũng đính kèm ảnh chụp màn hình vào đây để bạn tham khảo:
Diện tích trên các nút và TextView là tôi MapView
Kiểm tra nguồn gốc của Redpin. Nó thực hiện chính xác rằng – Reno