【问题标题】:How is PointF.set(x,y) different from new PointF(x,y) in java?PointF.set(x,y) 与 java 中的 new PointF(x,y) 有何不同?
【发布时间】:2016-01-09 04:55:51
【问题描述】:

我正在尝试在 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;
}

取消注释该行会使一切变得完美,问题是为什么?

【问题讨论】:

    标签: java android canvas view point


    【解决方案1】:

    在底部示例中,您正在创建 PointF 的新实例

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

    创建实例在内存中的成本可能比仅重用它们要高得多,因此您正在冗余地创建多余的对象这是一种低成本,但您应该避免创建不必要的对象。就像您应该避免代码中不必要的任何内容一样。

    另外,据我了解,PointF 中的 x,y 值是最终值,因此无法更改。所以看起来第二个选项是你必须采用的方式,因为 set 方法似乎只适用于空实例。如果它会使您的程序减慢很多,您总是可以将值存储在两个浮点数中。

    【讨论】:

    • 是的,这就是我首先使用 .set 版本的原因。但它给出了错误的值!而一个新的 pointF 给出了预期的值。我完全不明白这一点:(
    • 你在底部有括号,尝试在 .set 调用中使用完全相同的公式
    • 它没有帮助。我已经更新了问题中的代码。
    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多