LinearLayout View
を使用するための簡単なスライドアクションがありTouchListener
ます。
問題はMotionEvent.ACTION_MOVE
、私が触れて移動したときに呼び出され続けることです。
どうすればMotionEvent.ACTION_MOVE
呼び出されないようにできますか?
v.setOnTouchListener(null)
良くありません:falseを返し、機能していません。
MotionEvent.ACTION_MOVE
一度だけ呼ばれたいです。
private View.OnTouchListener touchEvent = new View.OnTouchListener() {
private float tempX;
private final float BASE_VALUE = 100;
private final boolean LEFT = false;
private final boolean RIGHT = true;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == MotionEvent.ACTION_DOWN){
tempX = event.getX();
}
if(event.getAction() == MotionEvent.ACTION_MOVE){
if(event.getX() < (tempX + BASE_VALUE)){
changeView(LEFT);
}else if(event.getX() > (tempX + BASE_VALUE)){
changeView(RIGHT);
}
}
完全には機能していません。
しかし、この実装は悪くありません(このコードは私の考えです)。
コード:
private View.OnTouchListener touchEvent = new View.OnTouchListener() {
private VelocityTracker mVelocityTracker;
private float tempX;
private final int MIN_DISTANCE = 120;
private final int THRESHOLD_VELOCITY = 200;
private final boolean LEFT = false;
private final boolean RIGHT = true;
private MotionEvent cancelEvent = MotionEvent.obtain(100, 100, MotionEvent.ACTION_CANCEL, 0, 0, 0);
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == MotionEvent.ACTION_DOWN){
Log.d(TAG, "Down");
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(event);
tempX = event.getX();
}
if(event.getAction() == MotionEvent.ACTION_MOVE){
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(100);
float velocityX = mVelocityTracker.getXVelocity();
if(tempX - event.getX() > MIN_DISTANCE
&& Math.abs(velocityX) > THRESHOLD_VELOCITY){
Log.d(TAG, "LEFT");
changeView(LEFT);
}else if(event.getX() - tempX > MIN_DISTANCE
&& Math.abs(velocityX) > THRESHOLD_VELOCITY){
Log.d(TAG, "RIGHT");
changeView(RIGHT);
}
v.dispatchTouchEvent(cancelEvent);
}