0

指の動きに合わせてビューを移動したい場合は、移動した距離を確認したい移動距離が予想よりも小さい場合は、ビューを元の位置に戻す必要があります。Android Animation:条件が満たされていないと、指でスムーズにビューを移動して元の位置に移動する方法

私はたくさんの検索をしましたが、以下のコードに到達しましたが、これは期待どおりに機能しません。触れると2つのビューが表示され、私の指の動きに左右されません。

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

どうすればこの問題を解決できますか。

答えて

0

あなたはまだ問題に直面しているならば、次のコードを試してみてください。

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; 
     } 
    }); 
関連する問題