Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
set(x,y)与java中新的PointF(x,y)有何不同?_Java_Android_Canvas_View_Point - Fatal编程技术网

set(x,y)与java中新的PointF(x,y)有何不同?

set(x,y)与java中新的PointF(x,y)有何不同?,java,android,canvas,view,point,Java,Android,Canvas,View,Point,我正在尝试在Android应用程序中实现画布视图的滚动 我初始化一个全局 private PointF backgroundPosition = new PointF(0, 0); 然后是这种行为 backgroundPosition.set(lastBackgroundPosition.x + (canvasMovingStartingPoint.x - event.getX()), lastBackgroundPosition.y + (canvasMovingStartingPoint.

我正在尝试在Android应用程序中实现画布视图的滚动

我初始化一个全局

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实例

在顶部,您只需更改实例值

创建实例在内存中的成本可能比重用实例要高得多,因此您需要冗余地创建多余的对象。这是一种低成本的方法,但您应该避免创建不必要的对象。与此相同,您应该避免代码中不必要的任何内容


另请注意,根据我的理解,点F中的x,y值是最终值,因此它们不能更改。因此,第二个选项似乎是您必须使用的方法,因为set方法似乎只适用于空实例。如果它使程序的速度降低了很多,您可以将值存储在两个浮点数中。

在下面的示例中,您正在创建一个新的PointF实例

在顶部,您只需更改实例值

创建实例在内存中的成本可能比重用实例要高得多,因此您需要冗余地创建多余的对象。这是一种低成本的方法,但您应该避免创建不必要的对象。与此相同,您应该避免代码中不必要的任何内容


另请注意,根据我的理解,点F中的x,y值是最终值,因此它们不能更改。因此,第二个选项似乎是您必须使用的方法,因为set方法似乎只适用于空实例。如果它使你的程序慢了很多,你总是可以将值存储在两个浮点数中。

是的,这就是为什么我先使用.set版本。但它给出了错误的值!而一个新的点f给出了预期的值。我完全不明白这一点:(底部有括号,请尝试在.set callIt中使用完全相同的公式。这没有帮助。我已更新了问题中的代码。是的,这就是为什么我先使用.set版本。但它给出了错误的值!而新的pointF给出了预期的值。我完全不明白这一点:(底部有括号,请尝试在.set callIt中使用完全相同的公式。这没有帮助。我已更新了问题中的代码。