Подтвердить что ты не робот

Как реализовать жест "Two Finger Drag" на Android?

Я новичок в разработке Android и работаю над проектом исследований доступности для слепых (проект Jelly Bean API уровня 17). Я экспериментировал с некоторыми жестами, а жест Two-Finger-Drag был очень сложным для реализации. Следующее изображение фиксирует то, что мне действительно нужно.

drag gesture

Я хочу, чтобы слепой пользователь перетаскивал два пальца по горизонтали (в любом месте экрана), и он получал аудиовыход текста, который он ввел в EditText. Также в соответствии с расстоянием, которое два пальца перемещают при перетаскивании, мы выводим каждое слово отдельно. (Пример ниже)

Пример: если пользователь набирает "Сегодня хороший день" и тащит палец (значение x) (скажем) 10 единиц влево, мы выводим "хороший день" , но если он перетаскивает его, говорит, что 20 единиц влево мы выводим "хороший день" , на 30 единиц налево "хороший день" и т.д.

Я наткнулся на который, кажется, обнаружил прикосновение двумя пальцами:

TouchEvent(MotionEvent event)

Также этот учебник по обнаруживает множественные касания кажется многообещающим, но мне нужно, чтобы он работал для touch и drag, который я не уверен, может быть реализован следующим образом.

Любые новые предложения по реализации этого или указатели на учебные пособия, которые могут помочь, будут замечательными!

Спасибо заранее, Штольня

4b9b3361

Ответ 1

Хорошо Так спасибо Гейбу здесь и многочисленным блогам на этом, я нашел решение своего вопроса!

Сначала я инициализировал свои переменные в классе "Активность"

int GLOBAL_TOUCH_POSITION_X = 0;
int GLOBAL_TOUCH_CURRENT_POSITION_X = 0;

Далее, Внутри onCreate():

//Two-Finger Drag Gesture detection
    RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView);
    TextLoggerLayout.setOnTouchListener(
            new RelativeLayout.OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent m) {
                    handleTouch(m); 
                    return true;
                }

    });

Теперь определите функцию handleTouch (m) следующим образом, она выводит текущее положение "Двустороннего касания" вместе с начальным положением касания:

void handleTouch(MotionEvent m){
    //Number of touches
    int pointerCount = m.getPointerCount();
    if(pointerCount == 2){
        int action = m.getActionMasked();
        int actionIndex = m.getActionIndex();
        String actionString;
        TextView tv = (TextView) findViewById(R.id.testDiffText);
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:                   
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            case MotionEvent.ACTION_UP:                 
                GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
                actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);  
                break;  
            case MotionEvent.ACTION_MOVE:
                GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1);
                int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X;
                actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);                   
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            default:
                actionString = "";
        }

        pointerCount = 0;
    }
    else {
        GLOBAL_TOUCH_POSITION_X = 0;
        GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
    }
}

Вот оно! Наконец, реализован жест "Два пальца". Похоже, я тоже могу нарисовать крошечный пост в блоге!:)

Ответ 2

Я не знаю, насколько релевантно добавить ответ сейчас к такому старому вопросу, но я разрабатывал библиотеку для поддержки базового 1 и 2 пальца на Android с очень простым снижением функциональности.

Большинство жестов можно установить так же легко, как

view.setOn2FingerGestureListener ( new On2FingerGestureListener () {
@Override 
onSwipeup() {
}
onSwipedown() {
}
});

Он доступен с открытым исходным кодом, а также доступен для загрузки как .jar

Ответ 3

Коснитесь и перетащите это серия событий. Сначала у вас есть падение, затем у вас есть 1 или более ходов, затем у вас есть повышение. Вы определяете начальную точку внизу, затем происходит движение по ходу. Перетаскивание останавливается наверху.

Для перетаскивания двумя пальцами обращайте внимание только на перетаскивание, если MotionEvent.getPointerCount() == 2.