移动后将视图返回到原始位置

时间:2014-09-26 11:06:05

标签: android coordinates android-view motionevent

我有一个包含text并包装它的布局。我需要在屏幕上垂直移动layout

这就是我的工作。

View valuesContainer = view.findViewById(R.id.valuesContainer);
valuesContainer.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) v.getLayoutParams();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    oldY = (int)event.getRawY();
                    initialTopMargin = params.topMargin;
                    break;
                case MotionEvent.ACTION_MOVE:
                    newY = (int)event.getY();
                    params.topMargin = (int) (initialTopMargin - (oldY - newY));
                    v.setLayoutParams(params);
                    }
                    break;
            }
            return true;
        }
    });

这会在屏幕上垂直移动布局。但是现在,当我退出屏幕的手指时,我需要这个布局回到原来的位置。

任何代码都是适当的

3 个答案:

答案 0 :(得分:2)

试试这个:

case MotionEvent.ACTION_UP:
     params.topMargin = initialTopMargin;
     v.setLayoutParams(params);

答案 1 :(得分:2)

使用 ACTION_UP 将布局移回原位。下面是代码。试试吧。

View valuesContainer = view.findViewById(R.id.valuesContainer);

valuesContainer.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) v.getLayoutParams();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    oldY = (int)event.getRawY();
                    initialTopMargin = params.topMargin;
                    break;
                case MotionEvent.ACTION_MOVE:
                    newY = (int)event.getY();
                    params.topMargin = (int) (initialTopMargin - (oldY - newY));
                    v.setLayoutParams(params);
                    break;
               case MotionEvent.ACTION_UP:
                    params.topMargin = initialTopMargin;
                    v.setLayoutParams(params);
                    break;
            }
            return true;
        }
    });

答案 2 :(得分:1)

获得ACTION_DOWN事件时存储初始pos。处理ACTION_UP事件,然后再将其设置为顶部。如果你想要它是平滑的,启动一个新的线程来更新值并等待或等等。