0

Je veux déplacer une vue avec le mouvement du doigt en douceur, puis je veux vérifier la distance déplacée, si le la distance déplacée est inférieure à la distance attendue alors je dois ramener la vue à sa position initiale.Android Animation: Comment déplacer une vue en douceur avec le doigt et passer à sa position initiale si la condition n'est pas remplie

J'ai beaucoup cherché, et je suis arrivé au code ci-dessous, mais cela ne fonctionne pas comme prévu, quand je le touche montre deux vues et se déplace au hasard non selon mon mouvement du doigt.

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

S'il vous plaît aidez-moi comment je peux obtenir ce correct.

Répondre

0

si vous rencontrez toujours le problème essayez le code suivant:

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