Как получить класс для реализации этого gestRecogniser? - PullRequest
0 голосов
/ 28 февраля 2012

Меня немного смущает полиморфизм и интерфейсы в Java.

По сути, я хочу создать класс gestRecogniser, который имеет методы:

-onLeftwardsSwipe ();

-onRightwardsSwipe ();

-onUpwardsSwipe();

-onDownwardsSwipe ();

gestRecogniser будет вызывать эти методы по мере необходимости.Второй класс реализует gestRecogniser и определяет, что должно быть сделано с этими событиями.Возможно ли это в Java?

Это класс, который я написал:

    public abstract class GestureRecogniser implements OnTouchListener {

    Activity activity;
    private float XWherePressed;
    private float XWhereReleased;
    private float YWherePressed;
    private float YWhereReleased;
    private static final int MINIMUM_DISTANCE_FOR_SWIPE = 100;


    public GestureRecogniser(Activity activity)
    {
        this.activity = activity;
    }

    public abstract void onLeftwardsSwipe();
    public abstract void onRightwardsSwipe();
    public abstract void onUpwardsSwipe();
    public abstract void onDownwardsSwipe();


    public boolean onTouch(View v, MotionEvent event)
    {
        switch(event.getAction())
        {
        case MotionEvent.ACTION_DOWN:

            this.XWherePressed = event.getX();
            this.YWherePressed = event.getY();

            break;

        case MotionEvent.ACTION_UP:

            this.XWhereReleased = event.getX();
            this.YWhereReleased = event.getY();

            float deltaX = XWhereReleased - XWherePressed;
            float deltaY = YWhereReleased - YWherePressed;

            if (Math.abs( deltaX ) > this.MINIMUM_DISTANCE_FOR_SWIPE)
            {
                //HORIZONTAL SWIPE
                if(deltaX > 0 )
                {
                    this.onRightwardsSwipe();
                    return true;
                }

                if(deltaX < 0)
                {
                    this.onLeftwardsSwipe();
                    return true;
                }

            }else return false;

            if (Math.abs( deltaY) > this.MINIMUM_DISTANCE_FOR_SWIPE)
            {
                //VERTICAL SWIPE
                if( deltaY < 0 )
                {
                    this.onDownwardsSwipe();
                    return true;
                }

                if ( deltaY > 0 )
                {
                    this.onUpwardsSwipe();
                    return true;
                }

            }else return false;

            break;

        }

        return false;
    }

}

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Мне удалось достичь желаемого результата, выполнив следующее:

1 - создать публичный интерфейс с методами:

public interface OnSwipeListener 
{
    public void onUpwardsSwipe();
    public void onDownwardsSwipe();
    public void onLeftwardsSwipe();
    public void onRightwardsSwipe();
}

2 - Создать класс, который реализует onTouchListener. Конструктор класса принимает объект OnSwipeListener. Метод onTouch () вызывает необходимые методы:

public class SwipeRecogniser implements OnTouchListener {

    private OnSwipeListener onSwipeListener;
    private float XWherePressed;
    private float XWhereReleased;
    private float YWherePressed;
    private float YWhereReleased;
    private static final int MINIMUM_DISTANCE_FOR_SWIPE = 100;


    public SwipeRecogniser(OnSwipeListener onSwipeListener)
    {
        this.onSwipeListener = onSwipeListener;
    }

    public boolean onTouch(View v, MotionEvent event)
    {
        switch(event.getAction())
        {

        case MotionEvent.ACTION_DOWN:
            this.XWherePressed = event.getX();
            this.YWherePressed = event.getY();

            break;

        case MotionEvent.ACTION_UP:
            this.XWhereReleased = event.getX();
            this.YWhereReleased = event.getY();

            float deltaX = XWhereReleased - XWherePressed;
            float deltaY = YWhereReleased - YWherePressed;

            if (Math.abs( deltaX ) > this.MINIMUM_DISTANCE_FOR_SWIPE)
            {
                //HORIZONTAL SWIPE
                if(deltaX > 0 )
                {
                    onSwipeListener.onRightwardsSwipe();
                    return true;
                }

                if(deltaX < 0)
                {
                    onSwipeListener.onLeftwardsSwipe();
                    return true;
                }

            }
            else return true;

            if (Math.abs( deltaY) > this.MINIMUM_DISTANCE_FOR_SWIPE)
            {
                //VERTICAL SWIPE
                if( deltaY < 0 )
                {
                    onSwipeListener.onDownwardsSwipe();
                    return true;
                }

                if ( deltaY > 0 )
                {
                    onSwipeListener.onUpwardsSwipe();
                    return true;
                }

            }
            else return true;

            break;  
        }   
        return true;
    }
}

3 - в пользовательском классе

public class MyClass extends Activity implements OnSwipeListener
{
 protected void onCreate(Bundle stuff)
 {
  //
  this.setOnTouchListener(new SwipeRecogniser(this));
 }

 public void onUpwardsSwipe(){/*methods*/}
 public void onDownwardsSwipe(){/*methods*/}
 public void onLeftwardsSwipe(){/*methods*/}
 public void onRightwardsSwipe(){/*methods*/}
}
0 голосов
/ 28 февраля 2012
//Declare below inner class
class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            // right to left swipe
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                ////swapped left
            }  
            else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    ////swapped right
            }
        } catch (Exception e) {
            // nothing
        }
        return false;
    }
}


//in your activtiy do below stuff and override onTouchEvent

private static final int SWIPE_MIN_DISTANCE = 50;
private static final int SWIPE_MAX_OFF_PATH = 400;
private static final int SWIPE_THRESHOLD_VELOCITY = 250;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;
    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Do your stuff
    gestureDetector = new GestureDetector(new MyGestureDetector());
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (gestureDetector.onTouchEvent(event)) {
                return true;
            }
            return false;
          }
    };
   }
    @Override
public boolean onTouchEvent(MotionEvent event) {
    if (gestureDetector.onTouchEvent(event))
       return true;
     else
           return false;
}
...