【问题标题】:Android Animation: How to move a view smoothly along with finger and move to its initial position if condition is not satisfiedAndroid动画:如果条件不满足,如何随着手指平滑移动视图并移动到其初始位置
【发布时间】:2017-04-12 11:16:35
【问题描述】:

我想随着手指的移动平滑地移动视图,然后我想检查移动的距离,如果移动的距离小于预期的距离,那么我必须将视图移回其初始位置。

我已经搜索了很多,我已经到达了下面的代码,但这并没有按预期工作,当我触摸它时会显示两个视图并且不根据我的手指移动随意移动。

myView.setOnTouchListener(new View.OnTouchListener() {
 @Override
 public boolean onTouch(View view, MotionEvent motionEvent) {
 float dX = 0, dY = 0;
 originalX = myView.getX();
 originalY = myView.getY();
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
 x1 = motionEvent.getX();
 break;
case MotionEvent.ACTION_UP:
x2 = motionEvent.getX();
float deltaX = x2 - x1;
if (Math.abs(deltaX) > MIN_DISTANCE) {
 myView.animate()
       .alpha(0.0f)
       .x(motionEvent.getRawX())
       .y(motionEvent.getRawY())
       .setDuration(500)
       .setListener(new Animator.AnimatorListener() {
 @Override
 public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
 myView.setVisibility(View.GONE);
 }
@Override
public void onAnimationCancel(Animator animator) {
 }
 @Override
public void onAnimationRepeat(Animator animator) {
 }
})
.start();
}else {
myView.setX(originalX);
myView.setY(originalY);
}
break;
 case MotionEvent.ACTION_MOVE:
myView.setX(motionEvent.getX());
myView.setY(motionEvent.getY());
break;
 }
return true;
 }
    });

请帮助我如何才能正确。

【问题讨论】:

    标签: android animation android-animation android-touch-event


    【解决方案1】:

    如果您仍然遇到问题,请尝试以下代码:

    private int _xDelta;
    private int _yDelta;
     myView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                float dX = 0, dY = 0;
                final int X = (int) motionEvent.getRawX();
                final int Y = (int) motionEvent.getRawY();
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();//Replace the RelativeLayout with your myView parent layout
                        x1 = myView.getX();
                        _xDelta = X - lParams.leftMargin;
                        _yDelta = Y - lParams.topMargin;
                        originalX = myView.getX();
                        originalY = myView.getY();
                        break;
                    case MotionEvent.ACTION_UP:
                        x2 = myView.getX();
                        float deltaX = x2 - x1;
                        if (Math.abs(deltaX) > MIN_DISTANCE) {
                            myView.animate()
                                    .alpha(0.0f)
                                    .x(motionEvent.getRawX())
                                    .y(motionEvent.getRawY())
                                    .setDuration(500)
                                    .setListener(new Animator.AnimatorListener() {
                                        @Override
                                        public void onAnimationStart(Animator animator) {
                                        }
                                        @Override
                                        public void onAnimationEnd(Animator animator) {
                                            myView.setVisibility(View.GONE);
                                        }
                                        @Override
                                        public void onAnimationCancel(Animator animator) {
                                        }
                                        @Override
                                        public void onAnimationRepeat(Animator animator) {
                                        }
                                    })
                                    .start();
                        }else {
                            myView.setX(originalX);
                            myView.setY(originalY);
                        }
                        break;
                    case MotionEvent.ACTION_MOVE:
                        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();//Replace the RelativeLayout with your myView parent layout
                        layoutParams.leftMargin = X - _xDelta;
                        layoutParams.topMargin = Y - _yDelta;
                        view.setLayoutParams(layoutParams);
                        break;
                }
                return true;
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2020-06-19
      • 2015-01-22
      • 2015-09-24
      相关资源
      最近更新 更多