媒体播放器响应第二次点击暂停

使用ViewPager进行图像滑动,每个图像onclick流不同的MP3。

应用程序包括50页(图像)和50个不同的MP3,所有mp3存储在应用程序本身。

恩。 首页流MP3(一),第二页流MP3(二)等到第五十页。

第一:

它的工作正常只有一个问题是:

In any page --> clicking the image --> PLAY MP3(one) --> click again--> PAUSE MP3 --> in paused state of MP3(one) SWIPE to next page --> --> in next page --> clicking the image --> PLAY MP3(two) --> click to pause the MP3(two) --> it doesn't respond to first click,it respond to second click to pause MP3(two). 

第二:

该应用程序包含50页和50个不同的MP3,我需要重复50次我已经做过的媒体播放器代码,或者有更好的方法来应用于所有50个媒体播放器MP3的单个代码,因为所有具有相同的function周期。

请给我任何建议以及如何在编码中应用它。

主要活动 :

 public class MainActivity extends Activity { private ViewPager mViewPager; MediaPlayer mp; private boolean isPaused; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager= (ViewPager) findViewById(R.id.view_pager); ImageAdapter adapter = new ImageAdapter(this); mViewPager.setAdapter(adapter); final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener()); mViewPager.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { tapGestureDetector.onTouchEvent(event); return false; } }); } private class TapGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (mViewPager.getCurrentItem() == 0) { if (mp != null) { if (isPaused) { mp.start(); isPaused = false; } else { mp.pause(); isPaused = true; } } else { mp = MediaPlayer.create(MainActivity.this, R.raw.aa); mp.start(); } } if (mViewPager.getCurrentItem() == 1) { if (mp != null) { if (isPaused) { mp.start(); isPaused = false; } else { mp.pause(); isPaused = true; } } else { mp = MediaPlayer.create(MainActivity.this, R.raw.bb); mp.start(); } } if (mViewPager.getCurrentItem() == 2) { if (mp != null) { if (isPaused) { mp.start(); isPaused = false; } else { mp.pause(); isPaused = true; } } else { mp = MediaPlayer.create(MainActivity.this, R.raw.cc); mp.start(); } } if (mViewPager.getCurrentItem() == 3) { if (mp != null) { if (isPaused) { mp.start(); isPaused = false; } else { mp.pause(); isPaused = true; } } else { mp = MediaPlayer.create(MainActivity.this, R.raw.dd); mp.start(); } } //AND SO ON FOR 50 PAGES// mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { if (mp == null) { return; } mp.release(); mp = null; } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } }); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer m) { Toast.makeText(MainActivity.this, "COMPLETED", Toast.LENGTH_LONG).show(); // Set the MainActivity member to null MainActivity.this.mp = null; } }); return super.onSingleTapConfirmed(e); } } } 

ImageAdapter:

  public class ImageAdapter extends PagerAdapter { Context context; private int[] GalImages = new int[] { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, }; ImageAdapter(Context context){ this.context=context; } @Override public int getCount() { return GalImages.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == ((ImageView) object); } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(context); int padding = context.getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin); imageView.setPadding(padding, padding, padding, padding); imageView.setScaleType(ImageView.ScaleType.CENTER); imageView.setImageResource(GalImages[position]); ((ViewPager) container).addView(imageView, 0); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((ImageView) object); } } 

我是android新手,我试图解决它,但没有成功,它的简单应用只包括MainActivity和ImageAdapter。

我尝试了下面的代码仍然没有解决的问题:

  mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { if (mp != null) { if (mp.isPlaying()) { mp.stop(); } mp.release(); mp = null; } } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } }); 

更新:

在任何页面中:

让我们说第(1)页—>点击播放MP3 —>(播放)—>点击暂停MP3 —>(暂停)—>滑到任何页面Rt或Lf — >(例如,翻到页面(两个))—>点击播放第(2)页上的MP3 —>(播放)—>点击暂停MP3页面(二)—>(暂停)—>(所有以前的onclick动作正常工作)—>点击继续播放已经处于暂停状态的页面(二)中的MP3 ====>但是当您点击页面(二)中的图像时错误地恢复播放MP3,你的手指不直,它稍微倾斜所以手指点击导致(点击页面(二)并同时刷到页面(三) ====>这里是发布页面(三) )MP3从一开始就独立播放。

我希望如果这偶然发生或者错误地不在页面(三)中开始播放MP3,直到我点击页面(三)中的图像然后开始播放MP3。

任何帮助将非常感激。

第一个问题答案: –

只需复制粘贴此代码,让我知道我没有测试它,但有一种强烈的感觉它会工作。

 import java.lang.reflect.Field; public class MainActivity extends Activity { private ViewPager mViewPager; MediaPlayer mp; private boolean isPaused; private ArrayList mMp3s; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (ViewPager) findViewById(R.id.view_pager); ImageAdapter adapter = new ImageAdapter(this); mMp3s=getAllMp3FilesFromRaw(); mViewPager.setAdapter(adapter); final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener()); mViewPager.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { tapGestureDetector.onTouchEvent(event); return false; } }); } private class TapGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (mp != null) { if (isPaused) { mp.start(); isPaused = false; } else { mp.pause(); isPaused = true; } } else { mp = MediaPlayer.create(MainActivity.this, mMp3s.get(mViewPager.getCurrentItem())); mp.start(); isPaused = false; } //AND SO ON FOR 50 PAGES// mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { if (mp == null) { return; } mp.release(); mp = null; isPaused = true; } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } }); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer m) { Toast.makeText(MainActivity.this, "COMPLETED", Toast.LENGTH_LONG).show(); // Set the MainActivity member to null finish(); MainActivity.this.mp = null; } }); return super.onSingleTapConfirmed(e); } } /** *Do it on background thread if it blocks the UI. */ private ArrayList getAllMp3FilesFromRaw() { ArrayList mp3s = new ArrayList<>(); try { Field fields[] = R.raw.class.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field f = fields[i]; int resIdentifier = getResources().getIdentifier(f.getName(), "raw", getPackageName()); mp3s.add(resIdentifier); } return mp3s; } catch (Exception e) { e.printStackTrace(); return null; } } } 

当您启动应用程序时,如果此过程花费太多时间在后台线程上执行,则逻辑是获取所有mp3文件资源ID。

现在使用那些resorce id播放你的歌曲,你可以获取的列表存在一些问题,例如它们可能与你的图像或viewpager编号不匹配,如果遇到任何错误,你必须应用其他逻辑让我知道。

Sec问题答案: -现在我认为当你想要点击图像同时播放音乐时,页面会被刷过,当它到达其他页面时,它会立即开始播放该页面的音乐。 如果我理解你的问题,因为我仍然不知道你使用的代码,我会引导你完成基于你可以应用逻辑的方法。

当页面更改为下一个页面时

 onPageChanged(int position) 

方法将被称为https://stackoverflow.com/a/11294494/5492047 ,您可以在这里应用逻辑。 现在如何,如果音乐正在播放,你在第一页,你刷到第二页,你必须做什么

 onPageChanged(int position) { mp.release(); mp=null; //Now initialiase it again with page two's music. mp = MediaPlayer.create(MainActivity.this, R.raw.aa); } 

并且不要调用mp.start(); 现在,当用户点击图像时

  OnClickListener(View view){ //use the same instance of mediaplayer and call mp.start(); if(isPlaying){ mp.pause(); }else{ mp.start(); } } 

我假设您只使用一个MediaPlayer实例,而不是您在代码中显示的实例。

首先我相信你的isPaused在暂停第一首歌后仍然保持正常,你可能需要在用户更改页面时将其设置为false:

 public void onPageSelected(int position) { if (mp == null) { return; } mp.release(); mp = null; isPaused = false; } 

SECOND你可以使用你可以在应用程序开始时初始化的List ,这样你就可以有一个结构来存储你的歌曲,因为它是你代码中唯一改变的东西,例如:

 List songs; @Override public void onCreate(Bundle savedInstanceState) { ... songs = new ArrayList<>(); songs.add(R.raw.aa); songs.add(R.raw.bb); //...etc } 

然后在你的onSingleTapConfirmed方法上,你可以只通过索引访问它们一次:

  if (mp != null) { if (isPaused) { mp.start(); isPaused = false; } else { mp.pause(); isPaused = true; } } else { mp = MediaPlayer.create(MainActivity.this, songs.get(mViewPager.getCurrentItem())); mp.start(); isPaused = false; } 

根据您的描述和我的理解,我列出了您希望程序执行的要求。

单击图像或切换页面后,MediaPlayer将像下面的规则一样响应。

规则:

  1. 如果之前没有播放歌曲,则单击,播放器将开始播放当前页面的歌曲。

  2. 如果以前播放过一首歌并且播放器仍在播放,则单击,播放器将暂停播放。

  3. 如果以前播放过一首歌并且播放器仍在播放,则切换,播放器将在之前释放并开始播放当前页面的歌曲。

  4. 如果之前播放的歌曲和播放器暂停,则单击,如果当前页面不是之前暂停的歌曲页面,播放器将在之前释放并开始播放当前页面的歌曲。

  5. 如果之前播放的歌曲和播放器暂停,则单击,如果当前页面是之前暂停的歌曲页面,则播放器将继续播放。

  6. 如果之前播放的歌曲和播放器暂停,则切换,没有发生。

阅读单词难以理解,请查看下图:(规则1实际上与规则4相同。) 规则

如果没有误解,我会开始回答这个问题。 或者请告诉我。

现在,我们清楚地说明了在不同情况下点击或切换页面时玩家的响应方式(当前页面是否是之前暂停的歌曲页面)。

我们来谈谈如何避免重复代码。 正如其他答案所说,使用歌曲列表并使用索引(页面数量)来区分它们。

所以他们被宣布为:

 List mMP3s = new ArrayList() { { add(R.raw.mp3_0); add(R.raw.mp3_1); add(R.raw.mp3_2); add(R.raw.mp3_3); add(R.raw.mp3_4); //... //AND SO ON FOR 50 PAGES// } }; 

当您单击图像(在图像上设置OnClickListener)时:

 @Override public void onClick(View view) { int position = mViewPager.getCurrentItem(); if (mp != null) { if (isPaused) { if (pausedPage == position) { mp.start(); } else { mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position)); mp.start(); } isPaused = false; } else { mp.pause(); isPaused = true; pausedPage = position; } } else { mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position)); mp.start(); isPaused = false; } mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer m) { Toast.makeText(MainActivity.this, "COMPLETED", Toast.LENGTH_LONG).show(); // Set the MainActivity member to null MainActivity.this.mp = null; } }); } 

当你切换页面时:

 @Override public void onPageSelected(int position) { if (!isPaused) { mp.release(); mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position)); mp.start(); tv.append("START page" + position + "\n"); } else { //do nothing. } } 

如果您仍然对代码感到困惑,请参阅此处 。 我在github上传了我的代码。