2

我可以使用坐标或经度和纬度显示一个位置,但我不知道如何在黑莓 MapField 中显示多个位置。如果可能,请与我分享如何做到这一点..

4

2 回答 2

5

如何在 BlackBerry Map 中显示我们自己的图标相同的方式?.

将坐标数组传递给自定义 MapField,为位置点定义位图,并在自定义 MapField 的 paint() 方法中为每个坐标绘制它。

请记住放大/缩小 CustomMapField 以最适合所有位置点。

实施示例

让我们用自定义位图图标(带黑色边框的黄色圆圈)显示利物浦谢菲尔德和伦敦。自定义 MapField 的代码:

class MultyMapField extends MapField {
    Coordinates[] mPoints = new Coordinates[0];
    Bitmap mPoint;
    Bitmap mPointsBitmap;
    XYRect mDest;
    XYRect[] mPointDest;

    public void addCoordinates(Coordinates coordinates) {
        Arrays.add(mPoints, coordinates);
        zoomToFitPoints();
        repaintPoints();
    }

    protected void zoomToFitPoints() {
        // zoom to max
        setZoom(getMaxZoom());

        // get pixels of all points
        int minLeft = getWidth();
        int minUp = getHeight();
        int maxRight = 0;
        int maxDown = 0;
        Coordinates minLeftCoordinates = null;
        Coordinates minUpCoordinates = null;
        Coordinates maxRightCoordinates = null;
        Coordinates maxDownCoordinates = null;
        for (int i = 0; i < mPoints.length; i++) {
            XYPoint point = new XYPoint();
            convertWorldToField(mPoints[i], point);
            if (point.x <= minLeft) {
                minLeft = point.x;
                minLeftCoordinates = mPoints[i];
            }
            if (point.x >= maxRight) {
                maxRight = point.x;
                maxRightCoordinates = mPoints[i];
            }
            if (point.y <= minUp) {
                minUp = point.y;
                minUpCoordinates = mPoints[i];
            }
            if (point.y >= maxDown) {
                maxDown = point.y;
                maxDownCoordinates = mPoints[i];
            }
        }

        double moveToLat = maxDownCoordinates.getLatitude()
                + (minUpCoordinates.getLatitude() - maxDownCoordinates
                        .getLatitude()) / 2;
        double moveToLong = minLeftCoordinates.getLongitude()
                + (maxRightCoordinates.getLongitude() - minLeftCoordinates
                        .getLongitude()) / 2;
        Coordinates moveTo = new Coordinates(moveToLat, moveToLong, 0);
        moveTo(moveTo);
        // zoom to min left up, max right down pixels + 1
        int zoom = getZoom();
        boolean outOfBounds = false;
        while (!outOfBounds && zoom > getMinZoom()) {
            zoom--;
            setZoom(zoom);
            XYPoint point = new XYPoint();
            try {
                convertWorldToField(minLeftCoordinates, point);
                if (point.x < 0)
                    outOfBounds = true;
                convertWorldToField(minUpCoordinates, point);
                if (point.y < 0)
                    outOfBounds = true;
                convertWorldToField(maxRightCoordinates, point);
                if (point.x > getWidth())
                    outOfBounds = true;
                convertWorldToField(maxDownCoordinates, point);
                if (point.y > getHeight())
                    outOfBounds = true;
            } catch (IllegalArgumentException ex) {
                outOfBounds = true;
            }
        }
        zoom++;
        setZoom(zoom);
    }

    protected void repaintPoints() {
        mPointsBitmap = new Bitmap(getWidth(), getHeight());
        mPointsBitmap.createAlpha(Bitmap.ALPHA_BITDEPTH_8BPP);
        mDest = new XYRect(0, 0, mPointsBitmap.getWidth(), mPointsBitmap
                .getHeight());
        Graphics g = new Graphics(mPointsBitmap);
        if (null != mPoint) {
            mPointDest = new XYRect[mPoints.length];
            for (int i = 0; i < mPoints.length; i++) {
                if (null == mPointDest[i]) {
                    XYPoint fieldOut = new XYPoint();
                    convertWorldToField(mPoints[i], fieldOut);
                    int imgW = mPoint.getWidth();
                    int imgH = mPoint.getHeight();
                    mPointDest[i] = new XYRect(fieldOut.x - imgW / 2,
                            fieldOut.y - imgH, imgW, imgH);
                }
                g.drawBitmap(mPointDest[i], mPoint, 0, 0);
            }
        }
    }

    protected void paint(Graphics graphics) {
        super.paint(graphics);
        if (null != mPointsBitmap) {
            graphics.setGlobalAlpha(100);
            graphics.drawBitmap(mDest, mPointsBitmap, 0, 0);
        }
    }
}

使用示例:

class Scr extends MainScreen {
    // test coordinates:
    // London
    // 51.507778, -0.128056
    Coordinates mLondonC = new Coordinates(51.507778, -0.128056, 0);
    // Liverpool
    // 53.4, -2.983333
    Coordinates mLiverpoolC = new Coordinates(53.4, -2.983333, 0);
    // Sheffield
    // 53.385833, -1.469444
    Coordinates mSheffieldC = new Coordinates(53.385833, -1.469444, 0);

    MultyMapField mMultyMapField;

    public Scr() {
        add(mMultyMapField = new MultyMapField());
        mMultyMapField.mPoint = createPointBitmap();
    }

    protected void onUiEngineAttached(boolean attached) {
        super.onUiEngineAttached(attached);
        if (attached) {
            mMultyMapField.addCoordinates(mLondonC);
            mMultyMapField.addCoordinates(mLiverpoolC);
            mMultyMapField.addCoordinates(mSheffieldC);
        }
    }

    private Bitmap createPointBitmap() {
        int r = 10;
        Bitmap result = new Bitmap(2 * r, 2 * r);
        result.createAlpha(Bitmap.ALPHA_BITDEPTH_8BPP);
        Graphics g = new Graphics(result);
        g.setColor(Color.BLACK);
        g.fillEllipse(r, r, 2 * r, r, r, 2 * r, 0, 360);
        g.setColor(Color.YELLOW);
        g.fillEllipse(r, r, r + (r - 2), r, r, r + (r - 2), 0, 360);
        return result;
    }
}
于 2009-10-12T12:02:35.870 回答
1

一个有效且可能更简单的选择是使用Monits 的这个开源库https://github.com/Monits/blackberry-commons

它包含 BB 应用程序中的几个常见功能,并且与 BB 4.6.1+ 兼容

除其他外,它提供了一个地图字段,能够在其顶部添加和显示标记,有焦点和没有焦点,还可以选择“打开”它们。这使得 API 与其他智能手机(如 iPhone 或 Android)上的 API 更加相似。

文档非常好,wiki 甚至有一个关于如何实现它的教程https://github.com/Monits/blackberry-commons/wiki/CustomMap

于 2012-06-28T00:53:41.517 回答