在触摸时拖动视图,然后在触摸释放时拖回原点位置



我想在屏幕上触摸拖动视图,在触摸释放时,我想将视图带回其原始位置。

这是我的代码:

private float xCoOrdinate, yCoOrdinate;
private float top2AxOriginXCoordinate, top2AxOriginYCoordinate;
private void initControls(View view) {
    top2AX = view.findViewById(R.id.top2AX);
    top2AxOriginXCoordinate = top2AX.getX();
    top2AxOriginYCoordinate = top2AX.getY();
    addDragListener();
}
private void addDragListener() {
     myView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        xCoOrdinate = view.getX() - event.getRawX();
                        yCoOrdinate = view.getY() - event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        view.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start();
                        break;
                    case MotionEvent.ACTION_UP:
                        view.animate().x(top2AxOriginXCoordinate).y(top2AxOriginYCoordinate).setDuration(500).start();
                        break;
                    default:
                        return false;
                }
                return true;
            }
        });
}
触摸

和拖动工作正常,但是当我释放触摸时,它不会回到其原点位置。它位于屏幕的左上角,略有左边距。我在这里做错了什么?

 top2AxOriginXCoordinate = top2AX.getX();
top2AxOriginYCoordinate = top2AX.getY();

可能是这两个变量是0.0,如果是这样,那么告诉我我会帮助你

我遇到了同样的问题,但需要注意的重要一点是,在Android在屏幕上放置和渲染视图之前,你会得到0。

正确的方法是向视图中添加一个观察点,然后以这种方式设置位置

 yourView.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    top2AxOriginXCoordinate = top2AX.getX();
                    top2AxOriginYCoordinate = top2AX.getY();
                    // Remove the listener afterwards
                    yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });

最新更新