Анимация Android: как плавно перемещать вид пальцем и перемещаться в исходное положение, если условие не выполняется

Я хочу плавно перемещать вид вместе с движением пальца, затем я хочу проверить пройденное расстояние, если пройденное расстояние меньше ожидаемого расстояния, тогда мне нужно переместить вид обратно в исходное положение.

Я много искал и пришел к приведенному ниже коду, но он не работает должным образом, когда я касаюсь, он показывает два вида и перемещается бессистемно, не в соответствии с движением моего пальца.

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;
 }
    });

Пожалуйста, помогите мне, как я могу получить это правильно.


person focus    schedule 12.04.2017    source источник


Ответы (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;
        }
    });
person user7676575    schedule 16.04.2017