jjzjj

android - 如果按钮是ACTION_DOWN,是否可以强行按住1秒?

coder 2023-11-21 原文

按住当前按钮 (ACTION_DOWN) 以获取按下时的当前时间。当我松开按钮(ACTION_UP)时,也会读取当前时间,并根据时差剪切和粘贴音频文件。如果用户按下和释放按钮的速度过快,则会生成无效的音频文件。所以想实现无条件按下超过1秒的功能。

Buttons 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;
        }
    });

最佳答案

你必须检查一下,如果 Action Up 和 down 之间的差异小于 1 分钟,则将 UP Time 设置为停机时间 + 60 秒。这将解决您的问题。 你必须把这个逻辑放在这里:

case MotionEvent.ACTION_UP: {
long currentDuration = vAudioPlayer.getCurrentDuration();
//your logic here
if (mRecordThread != null) {

关于android - 如果按钮是ACTION_DOWN,是否可以强行按住1秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51553251/

有关android - 如果按钮是ACTION_DOWN,是否可以强行按住1秒?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  7. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  8. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

随机推荐