Проведите пальцем по экрану с помощью AccessibilityService.

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

Point position=new Point(100,10);
GestureDescription.Builder builder = new GestureDescription.Builder();
Path p = new Path();
p.moveTo(position.x, position.y);
builder.addStroke(new GestureDescription.StrokeDescription(p, 100L, 50L));
GestureDescription gesture = builder.build();
boolean isDispatched =    dispatchGesture(gesture,gestureResultCallback,null);

person Ali Asjad    schedule 07.06.2017    source источник
comment
так что я могу выполнить только одно касание?   -  person Ali Asjad    schedule 07.06.2017
comment
хорошо, я, скорее всего, ошибся, кажется, API 24 добавил что-то для этого... забудьте, что я сказал... что возвращает dispatchGesture? правда или ложь?   -  person pskink    schedule 07.06.2017
comment
он возвращает истину   -  person Ali Asjad    schedule 07.06.2017
comment
так что с ним не так? кажется, этот жест был отправлен ...   -  person pskink    schedule 07.06.2017
comment
так как я выполняю одно касание, и оно также работает, но хочу сделать свайп,   -  person Ali Asjad    schedule 07.06.2017
comment
GestureResultCallback#onCompleted называется?   -  person pskink    schedule 07.06.2017
comment
ах, твой Path p пуст - в нем только moveTo , больше ничего   -  person pskink    schedule 07.06.2017
comment
да GestureResultCallback#onCompleted вызывается также   -  person Ali Asjad    schedule 07.06.2017
comment
пустой как ?объясните пожалуйста . это p.moveTo(position.x, position.y);   -  person Ali Asjad    schedule 07.06.2017
comment
у него есть только начальная точка, вам нужно добавить lineTo или что-то в этом роде   -  person pskink    schedule 07.06.2017
comment
не могли бы вы показать простой пример кода?   -  person Ali Asjad    schedule 08.06.2017


Ответы (2)


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

Я настроил глупый маленький слушатель «onAccessibilityEvent», который на моем Nexus 6 прыгает туда-сюда между домашним экраном 1 и домашним экраном два. Чтобы увидеть его в действии, у вас должны быть настроены два домашних экрана.

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    switch (event.getEventType()) {
        case AccessibilityEvent.TYPE_ANNOUNCEMENT:
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {

                DisplayMetrics displayMetrics = getResources().getDisplayMetrics();

                int middleYValue = displayMetrics.heightPixels / 2;
                final int leftSideOfScreen = displayMetrics.widthPixels / 4;
                final int rightSizeOfScreen = leftSideOfScreen * 3;
                GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
                Path path = new Path();

                if (event.getText() != null && event.getText().toString().contains("1")) {
                    //Swipe left
                    path.moveTo(rightSizeOfScreen, middleYValue);
                    path.lineTo(leftSideOfScreen, middleYValue);
                } else {
                    //Swipe right
                    path.moveTo(leftSideOfScreen, middleYValue);
                    path.lineTo(rightSizeOfScreen, middleYValue);
                }

                gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 100, 50));
                dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {
                    @Override
                    public void onCompleted(GestureDescription gestureDescription) {
                        Log.w("Gesture Completed");
                        super.onCompleted(gestureDescription);
                    }
                }, null);
            }

        default: {
            break;
        }
    }
}

Также важна информация о конфигурации специальных возможностей, проверьте мой XML-файл конфигурации.

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagReportViewIds"
android:canRetrieveWindowContent="true"
android:canRequestTouchExplorationMode="true"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:settingsActivity="com.moba11y.basicaccessibilityservice.SettingsActivity"
android:canPerformGestures="true"
/>

РЕДАКТИРОВАТЬ:

Чтобы поддерживать смахивание вверх или вниз, вам просто нужно изменить аргументы пути.

final int height = displayMetrics.heightPixels;
final int top = height * .25;
final int mid = height * .5;
final int bottom = height * .75;
final int midX = displayMetrics.widthPixels / 2;

if(swipeUp) {
    path.moveTo(midX, bottom);
    path.lineTo(midX, top);
} else {
    path.moveTo(midX, top);
    path.lineTo(midX, bottom);
}
person ChrisCM    schedule 09.06.2017
comment
Не могли бы вы обновить свой ответ, показав, как выполнять смахивание вверх и вниз, пожалуйста? заранее спасибо. - person BrowJr; 23.12.2019
comment
кто такой top? - person BrowJr; 24.12.2019
comment
Я думаю, что верх равен нулю, хотя мне не нравится начинать жесты с 0, поэтому я установил его на верхнюю четверть экрана... или высоту * 0,25. - person ChrisCM; 24.12.2019
comment
не работает. можешь обновить последнюю, @ChrisCM - person Archu Mohan; 15.10.2020
comment
Это принятый ответ, и он верен, когда он был написан, если у вас есть новый вопрос, задайте его и свяжите его здесь. - person ChrisCM; 02.11.2020
comment
Можем ли мы добавить цвет или анимацию в действие смахивания, чтобы знать движения указателя? @ChrisCM - person Rembulan Moon; 07.05.2021
comment
@ChrisCM Можно ли масштабировать или сжимать действие с помощью службы специальных возможностей? - person Rembulan Moon; 10.05.2021

Убедитесь, что вы настроили свой сервис для выполнения жестов:

android:canPerformGestures="true"

Настройте свой путь правильно:

p.moveTo(position.x, position.y);
p.lineTo(position.x + 300, position.y); 

Работает только на андроиде 24 и выше.

person user8010354    schedule 08.06.2017