Skip to content

Instantly share code, notes, and snippets.

@littlejavachild
Created January 10, 2016 17:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save littlejavachild/ae179e167a08d36365d2 to your computer and use it in GitHub Desktop.
Save littlejavachild/ae179e167a08d36365d2 to your computer and use it in GitHub Desktop.
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