Манипуляции со свайпом (swipe) на android

Для тех кто не знает, что такое свайп:

Swype (изм. от англ. swipe — проводить не отрывая, скользить + type — печатать текст) — торговая марка, используемая компанией Swype Inc. для обозначения способа ввода текста не отрывая палец/стилус от «кнопок клавиатуры» на сенсорном экране.

Допустим у вас есть необходимость отслеживать свайп по элементам списка в приложение и при определенных условиях (например свайп справа налево) удалять файл. Для этого можно использовать этот класс.

import android.app.Activity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

/**
 * @author fonclub <sfonclub@gmail.com>
 * @created 06.04.2017.
 */

public class SwipeTouchListener implements View.OnTouchListener {

    private static final String LOG_TAG = "SwipeTouchListener";
    private Activity activity;
    private static int MIN_DISTANCE;
    private float downX;
    private float downY;

    public SwipeTouchListener(Activity _activity) {
        activity = _activity;
        DisplayMetrics dm = activity.getResources().getDisplayMetrics();
        MIN_DISTANCE = (int) (120.0f * dm.densityDpi / 160.0f + 0.5);
    }

    private void onRightToLeftSwipe() {
        Log.i(LOG_TAG, "Справа налево!");
    }

    private void onLeftToRightSwipe() {
        Log.i(LOG_TAG, "Слева направо!");
        // удаляем файл или делаем любое действие с активити
        activity.deleteFile("file");
    }

    private void onTopToBottomSwipe() {
        Log.i(LOG_TAG, "Сверху вниз!");
    }

    private void onBottomToTopSwipe() {
        Log.i(LOG_TAG, "Снизу вверх!");
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                downX = event.getX();
                downY = event.getY();
                return true;
            }
            case MotionEvent.ACTION_UP: {
                float upX = event.getX();
                float upY = event.getY();

                float deltaX = downX - upX;
                float deltaY = downY - upY;

                // горизонтальный свайп
                if (Math.abs(deltaX) > MIN_DISTANCE) { // если дистанция не меньше минимальной
                    // слева направо
                    if (deltaX < 0) {
                        this.onLeftToRightSwipe();
                        return true;
                    }
                    //справа налево
                    if (deltaX > 0) {
                        this.onRightToLeftSwipe();
                        return true;
                    }
                }

                // вертикальный свайп
                if (Math.abs(deltaY) > MIN_DISTANCE) { //если дистанция не меньше минимальной
                    // сверху вниз
                    if (deltaY < 0) {
                        this.onTopToBottomSwipe();
                        return true;
                    }
                    // снизу вверх
                    if (deltaY > 0) {
                        this.onBottomToTopSwipe();
                        return true;
                    }
                }

                return false;
            }
        }
        return false;
    }
}

А в самой активити привязать обработчик к какому-то layout, например LinearLayout:

LinearLayout linear = (LinearLayout) activity.findViewById(R.id.itemList);
linear.setOnTouchListener(new SwipeTouchListener(activity));

Пример того, что можно сделать:

This entry was posted in Android and tagged , , . Bookmark the permalink.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*