当前位置: 首页 > 知识库问答 >
问题:

Seekbar一次又一次地更新整首歌

朱越
2023-03-14

您好,我想平稳地更新seekbar,每秒钟更新一次,所以我创建了一个使用计时器的方法,每秒钟更新seekbar,但它每秒钟都在更新歌曲,我到处搜索,但没有找到解决方案,我不想使用任何处理程序,我想用这个方法修复

 private  void updateseekbar() {


    seekBar.setMax(mediaPlayer.getDuration());

     new Timer().schedule(new TimerTask() {
       @Override
       public void run() {

                   seekBar.setProgress(mediaPlayer.getCurrentPosition());

       }
   },1000,1000);

在这里我实现了歌曲开始时的方法

  public void play(View v) {

    if (mediaPlayer == null) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        updateseekbar();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);
    } else if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
        imageview.setImageResource(R.drawable.img_btn_pause);
    } else if (mediaPlayer != null) {
        mediaPlayer.start();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);



    }

这是我的全部代码

private SeekBar seekBar;
TextView startduration,totalduration;
ImageView imageview, forwardd, backword, next, previous;
ArrayList<Integer> songlist = new ArrayList<>();
MediaPlayer mediaPlayer;
int seektime = 5000;
int index = 0;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    seekBar = (SeekBar) findViewById(R.id.seekBar);
    imageview = (ImageView) findViewById(R.id.imageview);
    forwardd = (ImageView) findViewById(R.id.forwardd);
    backword = (ImageView) findViewById(R.id.backword);
    next = (ImageView) findViewById(R.id.next);
    previous = (ImageView) findViewById(R.id.previous);
    startduration= (TextView) findViewById(R.id.startduration);
    totalduration= (TextView) findViewById(R.id.totalduration);


    songlist.add(R.raw.diljaniya);
    songlist.add(R.raw.stand);
    songlist.add(R.raw.haledil);
    songlist.add(R.raw.myname);
    songlist.add(R.raw.fiftyways);
    songlist.add(R.raw.desiboys);

    previous = (ImageView) findViewById(R.id.previous);

 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
     @Override
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

         seekBar.setMax(mediaPlayer.getDuration());
         mediaPlayer.seekTo(i);


     }

     @Override
     public void onStartTrackingTouch(SeekBar seekBar) {

     }

     @Override
     public void onStopTrackingTouch(SeekBar seekBar) {

     }
 });

    forwardd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (mediaPlayer != null) {
                int med = mediaPlayer.getCurrentPosition();
                if (med <= mediaPlayer.getDuration()) {
                    mediaPlayer.seekTo(med + seektime);
                    seekBar.setProgress(med+seektime);


                }
            } else {

            }
        }
    });
    backword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (mediaPlayer != null) {
                int med = mediaPlayer.getCurrentPosition();
                if (med - seektime >= 0) {
                    mediaPlayer.seekTo(med - seektime);
                    seekBar.setProgress(med-seektime);
                } else {
                }
            } else {
            }
        }
    });
}

public void play(View v) {

    if (mediaPlayer == null) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        updateseekbar();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);
    } else if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
        imageview.setImageResource(R.drawable.img_btn_pause);
    } else if (mediaPlayer != null) {
        mediaPlayer.start();
        imageview.setImageResource(R.drawable.img_btn_play_pressed);



    }

}

public void previouss(View v) {
    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.reset();
    }

    if (index < songlist.size() - 1) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        seekBar.setProgress(0);
    } else {
        index = 0;
        return;
    }
    index++;
}

public void next(View v) {

    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.reset();
    }
    if (index < songlist.size()) {
        mediaPlayer = MediaPlayer.create(this, songlist.get(index));
        mediaPlayer.start();
        seekBar.setProgress(0);
    } else {
        index = 0;
        return;
    }
    index++;
}


private  void updateseekbar() {


    seekBar.setMax(mediaPlayer.getDuration());

     new Timer().schedule(new TimerTask() {
       @Override
       public void run() {

                   seekBar.setProgress(mediaPlayer.getCurrentPosition());

       }
   },1000,1000);

}








}

共有1个答案

左丘善
2023-03-14

将计时器声明为全局成员变量,如下所示;

Timer timer=new Timer();

像这样更新updateseekbar方法里面的歌曲

  private void updateseekbar(Boolean songPlay) {
    if(songPlay){
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                seekBar.setProgress(mediaPlayer.getCurrentPosition());

            }
        },1000,1000);
        handler.postDelayed(runnable,0);
    }else {
        timer.cancel();
        timer.purge();
    }
}

在播放这样的歌曲时更新seekBar

updateseekbar(true);

像这样停止seekBar更新

updateseekbar(false);
 类似资料:
  • 我有一个脚本(bash),它监视pm2内存使用情况,如果pm2进程占用的内存超过2 GB,则重新启动进程。但是当我从脚本中运行命令(pm2 restart all)时,pm2中的所有进程不断地一次又一次地重新启动。 我正在通过crontab运行这个脚本。 我想要能够成功地重新启动所有的应用程序,而不需要连续的重新启动。

  • 我对高级Java和可重入锁的学习相当陌生。我知道ReentrantLock有一个公平性参数,它确保将锁提供给最缺线程(与同步的内部锁不同) 但是,Reentrant也意味着同一线程可以通过递增holdcount来一次又一次地重新获取锁。如果同一个线程一直获得锁,它如何保证公平性?

  • 问题内容: 我有两个表需要相同的值以实现非规范化。 这是查询。 第一张桌子 第二张桌子 如您所见,两个表之间的唯一区别是它们的名称和两个表没有该字段 无论如何将两个更新合并为一个? 问题答案: 如文档中所述,应该可以进行多表更新。 http://dev.mysql.com/doc/refman/5.5/en/update.html 注意:多表不支持LIMIT,因此根据具体情况,这可能会引起更多麻烦

  • 我问这个问题,尽管它已经被问了很多次,因为我找了几个小时没有找到解决办法。 但这还不是全部:我工作区中的每个项目都有同样的问题。我什么都跑不了。起初我以为这是因为我在Eclipse启动时犯了一个错误,所以我关闭了它并重新打开了它,但我在正确的工作区中。 我试图清理/重建它,但不起作用。 我试图扰乱属性>Java构建路径,但不起作用。 我试图用一个简单的“Hello World”创建一个新项目,但不

  • 问题内容: 我每周有一些设备的日志数据。对于某些设备,它从星期一开始,对于某些设备,它在星期三开始,等等。有时此数据中有〜月的间隔,但是我希望DataFrame索引仍然包含每周具有NaN值的行。 我正在尝试在Python中使用,但是我无法获得期望的结果。 例: 是)我有的: 我期望/想要的(请注意带有NaN的2个新行): 我得到的是: 因此,我获得了每个星期日的所有值和日期。但是我不需要每个星期天

  • 使用PyGame,我可以得到闪烁的东西。盒子,圆圈,文字,一切都在闪烁。我可以通过增加循环之间的等待时间来减少这种情况,但我想我可以通过一次将所有内容都绘制到屏幕上来消除这种情况,而不是单独进行所有操作。下面是一个发生在我身上的简单例子: “开始”按钮为我闪烁。这可能只是我较慢的电脑,但是有没有办法减少或消除闪烁?在我正在做的更复杂的事情中,情况变得非常糟糕。谢谢!