首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANDROID - MapView

ANDROID - MapView
EN

Stack Overflow用户
提问于 2011-05-11 11:39:59
回答 2查看 1.8K关注 0票数 2

有人能帮我一些关于地图的东西吗?我试着建。我有一个渲染器,它使用画布并在其中绘制一个位图。我已经创建了一个视图,并在构造函数中创建了:

代码语言:javascript
复制
bitmap = Bitmap.createBitmap(windowWidth, windowHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
drawable = new BitmapDrawable(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
this.Render();

在onDraw方法中,我有以下内容:

代码语言:javascript
复制
super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
drawable.draw(canvas);
canvas.restore();

现在,我想实现pan和缩放(目前我不使用保存的瓷砖)这里是我的onTouch:

mScaleDetector.onTouchEvent(ev);

代码语言:javascript
复制
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN: {
    this.hasPanned = false;
    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);

    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;
    if (this.mDownTouchX != this.mLastTouchX && this.mDownTouchY != mLastTouchY)
        this.hasPanned = true;
    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) {
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
        mLastTouchX = ev.getX(newPointerIndex);
        mLastTouchY = ev.getY(newPointerIndex);
        mActivePointerId = ev.getPointerId(newPointerIndex);
    }
    break;
}
}
return true;

这是我想要的,也是我遇到的问题:

  1. 当我平移时,我想计算以像素为单位的距离,这样我就可以知道我的渲染器何时再次呈现图像。这是如何实现的?通过记住ACTION_DOWN上的坐标并与ACTION_UP中的新坐标进行比较?
  2. 当pan完成(并且图像被重新呈现)时,我想将画布(图像)设置回它原来的位置。目前它保持窗格(因为canvas.translate?)
  3. 我怎么处理变焦手势?用这段代码用手指进行缩放时,图像被“拖”到左上角.

我是android (和java)的新手,所以任何帮助都是精确的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-31 19:13:33

如果缩放代码缩放画布,但不能正确移动它,我怀疑您调用了错误的Canvas.scale()方法。你所用的方法似乎是-

代码语言:javascript
复制
scale(float sx, float sy)

我觉得你应该用-

代码语言:javascript
复制
scale(float sx, float sy, float px, float py)

sx & sy显然是x&y标度因子(我通常将它们设置为相同的值)。px & py是缩放操作的中心点,例如MotionEvent.ACTION_DOWN和MotionEvent.ACTION_POINTER_DOWN事件坐标之间的中间点。

在我的MotionEvent.ACTION_POINTER_DOWN处理程序中我叫-

代码语言:javascript
复制
midPoint(mid, event);

mid的定义是-

代码语言:javascript
复制
private PointF mid = new PointF();

midPoint函数是-

代码语言:javascript
复制
private void midPoint(PointF point, MotionEvent event) 
{
   float x = event.getX(0) + event.getX(1);
   float y = event.getY(0) + event.getY(1);
   point.set(x / 2, y / 2);
}

所以在我的MotionEvent.ACTION_MOVE处理程序中我会打电话给-

代码语言:javascript
复制
Canvas.scale(sx, sy, mid.x, mid.y);
票数 2
EN

Stack Overflow用户

发布于 2011-05-27 20:26:28

1)是的,在ACTION_DOWN中只需做

代码语言:javascript
复制
PontF downAt = new PointF(event.getX(), event.getY());

在ACTION_UP中计算像素之间的差值。

2) MapView的工作方式与ImageView不同。对于您将使用的MapView

代码语言:javascript
复制
mapView.getController().animateTo(GeoPoint);

但我认为您确实希望从ImageView中子类,并重写onDraw(画布)方法,以直接访问画布。然后使用矩阵来处理翻译和缩放。

代码语言:javascript
复制
imageView.setScaleType(ImageView.ScaleType.MATRIX);
Matrix imageMatrix = new Matrix();
imageMatrix.postTranslate(xMove, yMove);
imageMatrix.postScale(scaleX, scaleY, midX, midY);
imageView.setImageMatrix(imageMatrix);

3)要处理缩放手势,需要处理ACTION_POINTER_DOWN、ACTION_MOVE和ACTION_POINTER_UP事件。这里有一个非常好的教程- 如何在Android中使用多点触控

当你缩放一个imageView时,任何后续的绘图都需要X,Y协调,使用矩阵mapPoints(Pts)方法进行缩放。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5963608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档