所以我有一个从屏幕中间开始的“明星”,这个点叫做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);
getPlanetX
和getPlanetY
如下所示:
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
字面意思只是在两个手指之间得分。如果这更容易,我们可以使用屏幕的中心。
好吧,这就是我所拥有的一切。如果您需要更多信息,请与我们联系。
答案 0 :(得分:1)
请查看以下代码段
{{1}}
基本上,您需要根据从触摸事件获得的比例值来缩放画布。你可以通过
来做到这一点您可以在缩放手势检测器的响应上设置缩放。之后调用无效。
有关详细信息,请访问https://developer.android.com/training/gestures/scale