我正在尝试在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方法似乎仅适用于空实例。如果将程序减慢的速度很多,则始终可以将值仅存储在两个浮点中。

关于java - PointF.set(x,y)与Java中新的PointF(x,y)有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34689836/

10-09 01:42