gpt4 book ai didi

java - 放大 Canvas 中的点,所有内容都基于某个点

转载 作者:行者123 更新时间:2023-12-02 11:17:42 24 4
gpt4 key购买 nike

好吧,有点奇怪。我会尽力解释。我正在 Android (Java) 上构建游戏。我只是先弄清楚观点。我要做的第一件事是太阳系 View (自上而下,二维,无倾斜)。我已经将所有行星和恒星按比例正确显示。我可以平移和缩放。唯一的问题是,我设置所有圆圈的绘制方式,它们都基于一个点(星星所在的位置),当我“缩放”/“平移”时,我实际上并没有缩放/平移。对于平移,我只是移动所有东西旋转的点,对于缩放,我没有缩放整个 Canvas (尝试过,没有成功)我正在调整元素的大小绘图,按照缩放。

所以我有一个从屏幕中间开始的“星星”,该点称为轨道位置。还有一个从 1f 开始的缩放变量。星星的绘制非常简单 - canvas.drawCircle((float)orbitLocation.x, (float)orbitLocation.y, this.radius * Zoom, this.paint);

每个行星的位置如下:canvas.drawCircle(getPlanetX(角度、轨道位置、缩放)、getPlanetY(角度、轨道位置、缩放)、this.radius * 缩放、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,用于天文单位 - 用于正确缩放。

现在我在缩放方面遇到的问题是,如果我平移,然后缩放,整个物体都会从轨道位置缩放,而不管我试图放大的位置,所以无论我的中间是什么屏幕,很快就会被抛离屏幕。

期望的结果。将任何内容放在屏幕中心(或捏在手指之间,无论哪种方式),停留在屏幕中心,轨道点会相应调整。

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

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 实际上只是获取 2 个手指之间的点。如果更容易的话,我们可以使用屏幕中心。

好了,我就这么多了。如果您需要更多信息,请告诉我。

最佳答案

请看下面的代码 fragment

private ScaleGestureDetector mScaleDetector;
private float zoom = 1.f;

public MyCustomView(Context mContext){
...
// View code goes here
...
mScaleDetector = new ScaleGestureDetector(context, new
ScaleListener());
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
return true;
}

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.scale(zoom, zoom);
...
// onDraw() code goes here
...
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.
zoom = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

invalidate();
return true;
}
}

基本上,您需要根据从触摸事件获取的缩放值来缩放 Canvas 。您可以通过以下方式做到这一点

  1. 保存 Canvas
  2. 缩放 Canvas
  3. 画出你正在画的东西
  4. 恢复 Canvas

您可以根据缩放手势检测器的响应设置缩放。之后调用invalidate。

欲了解更多信息,请访问 https://developer.android.com/training/gestures/scale

关于java - 放大 Canvas 中的点,所有内容都基于某个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50165355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com