Использование состояний для управления onTouchEvent - PullRequest
0 голосов
/ 10 октября 2019

Я делаю одноэкранное приложение простой логической схемы. Я использую onTouchEvent для обработки взаимодействия с пользователем. Я сейчас использую ACTION_UP, ACTION_MOVE, & ACTION_DOWN, но это позволяет мне использовать только один жест. Я хочу иметь возможность выбора опции в моем пользовательском интерфейсе, например, «И» ворота. Я хочу использовать одно касание, чтобы выбрать то, что я хочу сделать, а затем следующее касание, чтобы поместить ворота на экран. Вместо этого мой onTouchEvent позволяет мне только касаться нужного компонента, и я должен держать палец на экране, чтобы перетащить его в место, где я хочу его разместить. Это не хочу, я хочу.

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

@Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        Log.d("Debugging", "In onTouchEvent");

        if((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
            Touch.horizontalTouched = (int)motionEvent.getX()/ grid.getBlockSize();
            Touch.verticalTouched = (int)motionEvent.getY()/ grid.getBlockSize();
            whatWasTouched = whatWasTouched(Touch.horizontalTouched, Touch.verticalTouched);

        }else if((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE){
            //do nothing, finger is moving on screen
        }
        else if((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP){
            Touch.secondHorizontalTouch = (int)motionEvent.getX()/ grid.getBlockSize();
            Touch.secondVerticalTouch = (int)motionEvent.getY()/ grid.getBlockSize();
            placeComponent();
            draw();
        }
        return true;
    }

Я ожидаю, что мое первое касание на экране сможет выбрать параметр, например: «И», «ИЛИ», «НЕ», «ПЕРЕКЛЮЧАТЕЛЬ», «РЕДАКТИРОВАТЬ» и т. Д., Итогда мое второе касание завершает желаемое действие. Я также хочу иметь возможность прикоснуться к компоненту, который я поместил на экран, а затем к другому компоненту, чтобы я мог соединить их вместе.

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

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

@Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        Log.d("Debugging", "In onTouchEvent");
        if (placeState.getState() == false) {
            if ((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) {
                Touch.horizontalTouched = (int) motionEvent.getX() / grid.getBlockSize();
                Touch.verticalTouched = (int) motionEvent.getY() / grid.getBlockSize();
                whatWasTouched = whatWasTouched(Touch.horizontalTouched, Touch.verticalTouched);
                if(whatWasTouched.equals("DELETE")){
                    visualComponents.clear();
                    logicalComponents.clear();
                }
                placeState.toggleState();//sets to true
                draw();
            }

        }else if (placeState.getState() == true) {
            Touch.secondHorizontalTouch = (int) motionEvent.getX() / grid.getBlockSize();
            Touch.secondVerticalTouch = (int) motionEvent.getY() / grid.getBlockSize();
            placeComponent();
            placeState.toggleState();//sets to false
            draw();
        }
        return true;
    }
0 голосов
/ 11 октября 2019

По умолчанию прослушиватели событий в Android предназначены для ожидания - вам не нужно указывать какую-либо задержку.

Просто установите прослушиватель onTouchEvent (...) в ImageView и отобразите первое растровое изображение. При касании ImageView покажите следующее растровое изображение и так далее. Все, что вам нужно сделать, - это вести учет количества касаний, чтобы узнать, какое изображение показать (изображения 1, 2, 3, 4 и т. Д.).

Пример ...

public class LoadImage extends Activity {

int imageNumber = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_load_image);

    //get an image and create a bitmap from it

    ImageView imageView = (ImageView) findViewById(R.id.imageView);
    imageView.setImageBitmap(bitmap);

}

@Override
public boolean onTouchEvent(MotionEvent evt) {
    if (evt.getAction() == MotionEvent.ACTION_DOWN) {
        imageNumber++;
        switch (imageNumber) {
            case 2:
                // show image 2
                break;
            case 3:
                // show image 3
                break;
            ...
        }
        return true;
    }
    return false;
}

}

...