PointF.set(x,y) 与 java 中的 new PointF(x,y) 有何不同?
How is PointF.set(x,y) different from new PointF(x,y) in java?
我正在尝试在 Android 应用程序中为我的 Canvas 视图实现滚动。
我初始化一个全局的
private PointF backgroundPosition = new PointF(0, 0);
然后是这个
的行为
backgroundPosition.set(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
还有这个
backgroundPosition = new PointF(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
不知为何有些不同(第一个版本的卷轴快多了!!!)
为什么?!!!我为了它花了一整天!
完整代码如下:
public boolean onTouchEvent(@NonNull MotionEvent event, GII.AppState appState) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
pressedHere = true;
canvasMovingStartingPoint.set((int) event.getX(), (int) event.getY());
lastBackgroundPosition = backgroundPosition;
break;
case MotionEvent.ACTION_MOVE:
if (pressedHere &&
Math.sqrt((canvasMovingStartingPoint.x - event.getX()) * (canvasMovingStartingPoint.x - event.getX()) +
(canvasMovingStartingPoint.y - event.getY()) * (canvasMovingStartingPoint.y - event.getY())) > 10)
moving = true;
if (pressedHere && moving) {
backgroundPosition.set(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
//backgroundPosition = new PointF(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
checkBackground();
}
break;
case MotionEvent.ACTION_UP:
if (pressedHere && !moving) {
click(event.getX(), event.getY());
}
moving = false;
break;
default:
return false;
}
return true;
}
取消注释该行使一切变得完美,问题是为什么?
在底部示例中,您正在创建 PointF 的新实例
在顶部,您只需更改实例值。
创建实例在内存中的成本可能比仅重用它们要高得多,因此您正在冗余地创建多余的对象这是一种低成本,但您应该避免创建不必要的对象。与您应该避免代码中不必要的任何内容一样。
另请注意,根据我的理解,PointF 中的 x、y 值是最终值,因此无法更改。所以看起来第二个选项是你必须采用的方式,因为 set 方法似乎只适用于空实例。如果它使您的程序变慢很多,您总是可以将值存储在两个浮点数中。
我正在尝试在 Android 应用程序中为我的 Canvas 视图实现滚动。
我初始化一个全局的
private PointF backgroundPosition = new PointF(0, 0);
然后是这个
的行为backgroundPosition.set(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
还有这个
backgroundPosition = new PointF(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
不知为何有些不同(第一个版本的卷轴快多了!!!)
为什么?!!!我为了它花了一整天!
完整代码如下:
public boolean onTouchEvent(@NonNull MotionEvent event, GII.AppState appState) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
pressedHere = true;
canvasMovingStartingPoint.set((int) event.getX(), (int) event.getY());
lastBackgroundPosition = backgroundPosition;
break;
case MotionEvent.ACTION_MOVE:
if (pressedHere &&
Math.sqrt((canvasMovingStartingPoint.x - event.getX()) * (canvasMovingStartingPoint.x - event.getX()) +
(canvasMovingStartingPoint.y - event.getY()) * (canvasMovingStartingPoint.y - event.getY())) > 10)
moving = true;
if (pressedHere && moving) {
backgroundPosition.set(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
//backgroundPosition = new PointF(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.y - event.getY()));
checkBackground();
}
break;
case MotionEvent.ACTION_UP:
if (pressedHere && !moving) {
click(event.getX(), event.getY());
}
moving = false;
break;
default:
return false;
}
return true;
}
取消注释该行使一切变得完美,问题是为什么?
在底部示例中,您正在创建 PointF 的新实例
在顶部,您只需更改实例值。
创建实例在内存中的成本可能比仅重用它们要高得多,因此您正在冗余地创建多余的对象这是一种低成本,但您应该避免创建不必要的对象。与您应该避免代码中不必要的任何内容一样。
另请注意,根据我的理解,PointF 中的 x、y 值是最终值,因此无法更改。所以看起来第二个选项是你必须采用的方式,因为 set 方法似乎只适用于空实例。如果它使您的程序变慢很多,您总是可以将值存储在两个浮点数中。