Если кнопка ACTION_DOWN, можно ли ее принудительно удерживать в течение 1 секунды?

Удерживает текущую кнопку (ACTION_DOWN), чтобы получить текущее время при нажатии. Когда я отпускаю кнопку (ACTION_UP), также берется текущее время, а аудиофайл вырезается и вставляется по разнице во времени. Если пользователь нажмет и отпустит кнопку слишком быстро, будет сгенерирован недопустимый аудиофайл. Вот и хотелось бы реализовать функцию безусловного нажатия более 1 секунды.

Кнопки ACTION_DOWN, ACTION_UP Есть ли способ реализовать такую ​​функциональность в событии движения? Если вы знаете, пожалуйста, сделайте мне одолжение. Ниже приведен исходный код сенсорного прослушивателя.

recordBtn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    long currentDuration = vAudioPlayer.getCurrentDuration();
                    // 녹음 시작 ( combineList 사이즈가 짝수일 때 )
                    if (mRecordThread != null) {
                        if (combineList.size() % 2 == 0) {
                            mRecordThread.startFileWrite(currentDuration);
                            combineList.add(currentDuration);
                        }
                    }
                }

                // 버튼, 이미지 뷰 애니메이션
                micBg1.setVisibility(View.VISIBLE);
                micBg2.setVisibility(View.VISIBLE);

                micBg1.startAnimation(animMic1);
                micBg2.startAnimation(animMic2);

                //userImg.setImageBitmap(userImgBitmap);
                userImg.startAnimation(animZoomIn);
                // artistImg.setImageBitmap(artistBlurImg);
                artistImg.startAnimation(animZoomOut);

                break;
                case MotionEvent.ACTION_UP: {
                    long currentDuration = vAudioPlayer.getCurrentDuration();
                    if (mRecordThread != null) {
                        // 병합을 시작 ( combineList가 홀수일 때: 레코드 버튼을 눌렀을 때 combineList의 사이즈가 홀수가 된다 )
                        if (combineList.size() % 2 == 1) {
                            mRecordThread.stopFileWrite();

                            File waveFile = new File(RecordActivity.currentCreateFileName.replaceAll("/ucc/", "/tmp/")
                                    + "_" + calTime(combineList.get(combineList.size() - 1), false) + "_uv.pcm");

                            // 위의 경로에 해당 녹음 파일이 존재하면 wav 파일로 변환,
                            if (waveFile.exists()) {

                                copyWaveFile(RecordActivity.currentCreateFileName.replaceAll("/ucc/", "/tmp/") + "_" + calTime(combineList.get(combineList.size() - 1), false) + "_uv.pcm",
                                        RecordActivity.currentCreateFileName.replaceAll("/ucc/", "/tmp/") + "_" + calTime(combineList.get(combineList.size() - 1), false) + "_u0.wav");

                                // wav 볼륨 파일 증폭
                                if (mMp3ConcatThread != null) {
                                    mMp3ConcatThread.startCombine(null, 3333333333333333333L, combineList.get(combineList.size() - 1), currentDuration);
                                }
                            }

                            combineList.add(currentDuration);
                            // startCombine Thread 분기 처리( if old_position: 0, 3333333333333333333L, 7777777777777777777L, 그 외 )
                            if (combineList.size() == 2) {
                                // 0: 처음 한번 녹음할 때
                                mMp3ConcatThread.startCombine(null, 0, combineList.get(combineList.size() - 2), currentDuration);
                            } else {
                                // 그 외: 두번 이상 녹음할 때
                                mMp3ConcatThread.startCombine(null, combineList.get(combineList.size() - 3), combineList.get(combineList.size() - 2), currentDuration);
                            }
                        }
                    }
                }

                // 버튼, 이미지 뷰 애니메이션
                micBg1.setVisibility(View.GONE);
                micBg2.setVisibility(View.GONE);

                micBg1.clearAnimation();
                micBg2.clearAnimation();

                // userImg.setImageBitmap(userBlurImg);
                userImg.startAnimation(animZoomOut);
                // artistImg.setImageBitmap(artistImgBitmap);
                artistImg.startAnimation(animZoomIn);
                break;
            }
            return false;
        }
    });

person Junburg    schedule 27.07.2018    source источник
comment
вместо того, чтобы пытаться заставить кнопку удерживаться нажатой, можете ли вы добавить логику, чтобы просто продолжать запись в течение 1 секунды, если ACTION_UP произойдет слишком рано? (и отключить кнопку, пока это происходит)?   -  person Mateo    schedule 01.08.2018
comment
привет.. просто чтобы знать, это метод stopWriteFile, который завершает операцию вырезания файла?   -  person Pier Giorgio Misley    schedule 02.08.2018


Ответы (1)


Вы должны поставить галочку, если разница между Action Up и Down меньше 1 минуты, установите UP Time как время простоя + 60 секунд. Это решит вашу проблему. Вы должны поместить эту логику здесь:

case MotionEvent.ACTION_UP: {
long currentDuration = vAudioPlayer.getCurrentDuration();
//your logic here
if (mRecordThread != null) {
person Surendra Kumar    schedule 01.08.2018
comment
Смотрите... проблема, которую вам нужно решить, это минимальное время должно быть 1 минута. Если вы начинаете отсечение аудио с длинной currentDuration = vAudioPlayer.getCurrentDuration(); и ACTION_UP происходит до 60 секунд, поставьте галочку. Если разница между ACTION_UP и ACTION_DOWN меньше 60 секунд, время окончания клипа должно быть равно времени ACTION_DOWN + 60 секунд. - person Surendra Kumar; 02.08.2018