Created
January 10, 2016 17:16
-
-
Save littlejavachild/ae179e167a08d36365d2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.archenemy.simplealarm; | |
import android.graphics.PointF; | |
import android.view.MotionEvent; | |
import android.view.View; | |
/** | |
* Created by archenemy on 10/1/16. | |
*/ | |
// http://stackoverflow.com/questions/16557076/how-to-smoothly-move-a-image-view-with-users-finger-on-android-emulator | |
public class SliderListener implements View.OnTouchListener{ | |
private View left; | |
private View right; | |
private View slider; | |
private PointF reference; | |
private OnSliderOptionSelectedListener listener; | |
private PointF touchDown = new PointF(); | |
private PointF touchStart = new PointF(); | |
//------------------------------------------------------------------------------------------ | |
public SliderListener(View left, View slider, PointF reference, View right, | |
OnSliderOptionSelectedListener listener){ | |
this.left = left; | |
this.reference = reference; | |
this.right = right; | |
this.slider = slider; | |
this.listener = listener; | |
} | |
//------------------------------------------------------------------------------------------ | |
@Override | |
public boolean onTouch(View v, MotionEvent event) { | |
switch( event.getAction() ){ | |
case MotionEvent.ACTION_MOVE: | |
PointF mv = new PointF( event.getX()-touchDown.x, event.getY()-touchDown.y ); | |
float newX = touchStart.x + mv.x; | |
if( newX < left.getX() ){ | |
v.setX( left.getX() ); | |
touchStart = new PointF( v.getX(),v.getY() ); | |
}else if( newX > right.getX() ){ | |
v.setX( right.getX() ); | |
touchStart = new PointF( v.getX(),v.getY() ); | |
}else{ | |
v.setX( newX ); | |
touchStart = new PointF( v.getX(),v.getY() ); | |
} | |
break; | |
case MotionEvent.ACTION_DOWN: | |
touchDown.x = event.getX(); | |
touchDown.y = event.getY(); | |
touchStart = new PointF( v.getX(),v.getY() ); | |
break; | |
case MotionEvent.ACTION_UP: | |
int sliderCenterX = (int) (slider.getX() + (slider.getWidth()/2)); | |
int sliderCenterY = (int) (slider.getY() + (slider.getHeight()/2)); | |
if( isWithinBounds(sliderCenterX,sliderCenterY,left) ){ | |
listener.onLeftSelected(); | |
}else if( isWithinBounds(sliderCenterX,sliderCenterY,right) ){ | |
listener.onRightSelected(); | |
}else{ | |
v.animate().translationX(reference.x).setDuration(250).start(); | |
} | |
break; | |
default: | |
break; | |
} | |
return true; | |
} | |
//------------------------------------------------------------------------------------------ | |
private boolean isWithinBounds(float x,float y,View v){ | |
float viewX = v.getX(); | |
float viewY = v.getY(); | |
boolean isWithinBounds = true; | |
isWithinBounds &= (x >= viewX && x <= viewX + v.getWidth()); | |
isWithinBounds &= (y >= viewY && y <= viewY + v.getHeight()); | |
return isWithinBounds; | |
} | |
//------------------------------------------------------------------------------------------ | |
interface OnSliderOptionSelectedListener{ | |
void onLeftSelected(); | |
void onRightSelected(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment