放大画布中的点,其中所有内容都基于特定点

时间:2018-05-04 00:05:31

标签: java android canvas

好吧,有点奇怪的。我会尽力解释。 我正在Android(Java)上构建游戏。我只是先制定意见。我正在做的第一件事是太阳系视图(自上而下,2d,没有倾斜)。我已经让所有的行星和恒星都能正常显示,而且比例正确。我可以平移和缩放。唯一的问题是,我设置所有圆圈绘制的方式,它们都是基于一个点(星星所在的位置),当我'缩放'/'平移'时我实际上并不是缩放/平移。对于平移,我只是移动所有旋转的点,对于缩放,我没有缩放整个画布(尝试过,没有成功)我正在调整元素的大小我是根据缩放绘图。

所以我有一个从屏幕中间开始的“明星”,这个点叫做orbitLocation。 以1f开头的缩放变量。 这颗星很简单 - canvas.drawCircle((float)orbitLocation.x, (float)orbitLocation.y, this.radius * zoom, this.paint);

每个行星的位置如下: canvas.drawCircle(getPlanetX(angle, orbitLocation, zoom), getPlanetY(angle, orbitLocation, zoom), this.radius * zoom, this.paint);

getPlanetXgetPlanetY如下所示:

private float getPlanetX(double angle, Point orbitingPoint, float zoom) {
        return orbitingPoint.x + (this.distance * Constants.AU * zoom) * (float)Math.sin(angle);
    }

    private float getPlanetY(double angle, Point orbitingPoint, float zoom) {
        return orbitingPoint.y + (this.distance * Constants.AU * zoom) * (float)Math.cos(angle);
    }

Constants.AU是天文单位的常数int 11507 - 用于正确缩放。

现在我有缩放的问题,如果我平移,然后缩放,整个事物从orbitLocation扩展,忽略我正在尝试放大的位置,所以无论在我的中间是什么屏幕,快速离开屏幕。

期望的结果。无论屏幕中央是什么(或者在捏合手指之间,无论哪种方式),都要保持在屏幕的中心,并且轨道点可以自行调整。

以下是我的触摸事件的相关部分:

if (touchCount == 2) { // if pinch
                    if (startZoomTouchPoint != null) {
                        float newDistance = getDistance(event, 0, 1);
                        float distanceDifference = (startZoomDistance - newDistance);
                        zoom -= distanceDifference * (zoom / 100);
                        if (zoom < MIN_ZOOM) {
                            zoom = MIN_ZOOM;
                        }

//                        Point zoomCenter = getZoomCenter(event);
//                        int yOrbitOffset = orbitLocation.y - zoomCenter.y;
//                        int xOrbitOffset = orbitLocation.x - zoomCenter.x;
//                        orbitLocation.x += xOrbitOffset + Constants.AU * zoom;
//                        orbitLocation.y += yOrbitOffset + Constants.AU * zoom;

                        startZoomDistance = newDistance;
                        updateStartZoomTouchPoint(event);
                    }
                }

中间的评论线是我最近实现目标的尝试。

每当我尝试时,我要么移动orbitLocation方式太多,要么不够,或者它会奇怪地移动。

getZoomCenter字面意思只是在两个手指之间得分。如果这更容易,我们可以使用屏幕的中心。

好吧,这就是我所拥有的一切。如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

请查看以下代码段

{{1}}

基本上,您需要根据从触摸事件获得的比例值来缩放画布。你可以通过

来做到这一点
  1. 保存画布
  2. 缩放画布
  3. 画出你正在画的东西
  4. 恢复画布
  5. 您可以在缩放手势检测器的响应上设置缩放。之后调用无效。

    有关详细信息,请访问https://developer.android.com/training/gestures/scale