Mediaplayer 响应第二次点击暂停
Mediaplayer respond to second click to pause
图片滑动使用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 的单个代码中执行此操作,因为所有具有相同的功能循环。
请提供任何建议以及如何在编码中应用它。
主要活动:
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);
}
}
}
图像适配器:
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
}
});
更新:
在任何页面中:
假设页面(一)--->点击播放MP3--->(播放)--->点击暂停MP3--->(暂停)--->滑动到任意页面RT或Lf --->(例如滑动到页面(二))--->点击播放页面(二)的MP3 --->(播放)--->点击暂停页面(二)的MP3 - --> (paused) ---> (之前所有的onclick动作都正常工作) ---> 在已经处于暂停状态的页面(二)点击继续播放MP3 ====> 但是当你点击页面(二)中的图像恢复播放 MP3 时,你的手指不直,它略微倾斜所以手指点击导致(点击页面(二)并同时滑动到页面(三)====>这里是问题页面(三)MP3从头开始自己播放.
我想如果这种情况偶尔发生或错误地不开始播放第(三)页中的MP3,直到我点击第(三)页中的图像然后开始播放MP3。
任何帮助将不胜感激。
第一个
我相信您的 isPaused
在暂停第一首歌曲后保持正确,当用户更改页面时您可能需要将其设置为 false :
public void onPageSelected(int position) {
if (mp == null) {
return;
}
mp.release();
mp = null;
isPaused = false;
}
第二个
您可以使用可以在应用程序开始时初始化的 List<Integer>
,这样您就可以有一个结构来存储您的歌曲,因为它是您的代码中唯一改变的地方,例如:
List<Integer> 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;
}
第一题答案:-
只需复制粘贴此代码,让我知道我还没有测试过它,但强烈感觉它会起作用。
import java.lang.reflect.Field;
public class MainActivity extends Activity {
private ViewPager mViewPager;
MediaPlayer mp;
private boolean isPaused;
private ArrayList<Integer> 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<Integer> getAllMp3FilesFromRaw() {
ArrayList<Integer> 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,如果此过程花费太多时间,请在后台线程上执行。
使用这些资源 ID 播放您的歌曲现在您获取的列表存在很多问题,例如它们可能与您的图像或 viewpager 编号不匹配,因为如果您遇到任何错误,您将不得不应用一些其他逻辑让我知道。
二题答案:-
现在我假设当你想点击图像同时播放音乐时,错误地滑动了页面,当它到达其他页面时,它立即开始播放该页面的音乐。如果我理解你的问题,因为我仍然不知道你使用的是哪种代码,我将指导你完成基于你可以应用逻辑的方法。
当页面转到下一页时
onPageChanged(int position)
方法将被调用 在这里你可以应用逻辑。
现在如何,如果音乐正在播放并且您在第一页上,然后滑动到第二页,您必须在
中做什么
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 实例,这与您在代码中显示的不同。
根据你的描述和我的理解,我列出了你希望程序做的需求。
一旦您点击图片或切换页面,MediaPlayer 将响应如下规则。
规则:
如果之前没有播放过歌曲,您点击,播放器将开始播放当前页面的歌曲。
如果之前播放过一首歌,播放器还在播放,点击,播放器会暂停。
如果之前播放过的歌曲,播放器还在播放,你切换,播放器会之前放开,开始播放当前页面的歌曲。
如果之前播放过一首歌曲并且播放器暂停,您点击,如果当前页面不是之前暂停的歌曲页面,播放器将之前释放并开始播放当前页面的歌曲。
如果之前播放的歌曲暂停播放,点击,如果当前页面是之前暂停的歌曲页面,播放器将继续播放。
如果之前播放过一首歌曲并且播放器暂停,您切换,没有任何反应。
看字看不懂,请看下图:
(规则 1 实际上与规则 4 相同。)
如果没有误会,我就开始答题了。或者请告诉我。
现在明确不同情况下点击或切换页面时播放器的反应(当前页面是否为之前暂停的歌曲页面)。
让我们谈谈如何避免重复代码。正如其他答案所说,使用歌曲列表并使用索引(页数)来区分每首歌曲。
所以他们是这样声明的:
List<Integer> mMP3s = new ArrayList<Integer>() {
{
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.
}
}
如果您对代码还有疑惑,请看here。我在 github.
上上传了我的代码
图片滑动使用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 的单个代码中执行此操作,因为所有具有相同的功能循环。
请提供任何建议以及如何在编码中应用它。
主要活动:
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);
}
}
}
图像适配器:
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
}
});
更新:
在任何页面中:
假设页面(一)--->点击播放MP3--->(播放)--->点击暂停MP3--->(暂停)--->滑动到任意页面RT或Lf --->(例如滑动到页面(二))--->点击播放页面(二)的MP3 --->(播放)--->点击暂停页面(二)的MP3 - --> (paused) ---> (之前所有的onclick动作都正常工作) ---> 在已经处于暂停状态的页面(二)点击继续播放MP3 ====> 但是当你点击页面(二)中的图像恢复播放 MP3 时,你的手指不直,它略微倾斜所以手指点击导致(点击页面(二)并同时滑动到页面(三)====>这里是问题页面(三)MP3从头开始自己播放.
我想如果这种情况偶尔发生或错误地不开始播放第(三)页中的MP3,直到我点击第(三)页中的图像然后开始播放MP3。
任何帮助将不胜感激。
第一个
我相信您的 isPaused
在暂停第一首歌曲后保持正确,当用户更改页面时您可能需要将其设置为 false :
public void onPageSelected(int position) {
if (mp == null) {
return;
}
mp.release();
mp = null;
isPaused = false;
}
第二个
您可以使用可以在应用程序开始时初始化的 List<Integer>
,这样您就可以有一个结构来存储您的歌曲,因为它是您的代码中唯一改变的地方,例如:
List<Integer> 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;
}
第一题答案:-
只需复制粘贴此代码,让我知道我还没有测试过它,但强烈感觉它会起作用。
import java.lang.reflect.Field;
public class MainActivity extends Activity {
private ViewPager mViewPager;
MediaPlayer mp;
private boolean isPaused;
private ArrayList<Integer> 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<Integer> getAllMp3FilesFromRaw() {
ArrayList<Integer> 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,如果此过程花费太多时间,请在后台线程上执行。
使用这些资源 ID 播放您的歌曲现在您获取的列表存在很多问题,例如它们可能与您的图像或 viewpager 编号不匹配,因为如果您遇到任何错误,您将不得不应用一些其他逻辑让我知道。
二题答案:- 现在我假设当你想点击图像同时播放音乐时,错误地滑动了页面,当它到达其他页面时,它立即开始播放该页面的音乐。如果我理解你的问题,因为我仍然不知道你使用的是哪种代码,我将指导你完成基于你可以应用逻辑的方法。
当页面转到下一页时
onPageChanged(int position)
方法将被调用 在这里你可以应用逻辑。 现在如何,如果音乐正在播放并且您在第一页上,然后滑动到第二页,您必须在
中做什么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 实例,这与您在代码中显示的不同。
根据你的描述和我的理解,我列出了你希望程序做的需求。
一旦您点击图片或切换页面,MediaPlayer 将响应如下规则。
规则:
如果之前没有播放过歌曲,您点击,播放器将开始播放当前页面的歌曲。
如果之前播放过一首歌,播放器还在播放,点击,播放器会暂停。
如果之前播放过的歌曲,播放器还在播放,你切换,播放器会之前放开,开始播放当前页面的歌曲。
如果之前播放过一首歌曲并且播放器暂停,您点击,如果当前页面不是之前暂停的歌曲页面,播放器将之前释放并开始播放当前页面的歌曲。
如果之前播放的歌曲暂停播放,点击,如果当前页面是之前暂停的歌曲页面,播放器将继续播放。
如果之前播放过一首歌曲并且播放器暂停,您切换,没有任何反应。
看字看不懂,请看下图:
(规则 1 实际上与规则 4 相同。)
如果没有误会,我就开始答题了。或者请告诉我。
现在明确不同情况下点击或切换页面时播放器的反应(当前页面是否为之前暂停的歌曲页面)。
让我们谈谈如何避免重复代码。正如其他答案所说,使用歌曲列表并使用索引(页数)来区分每首歌曲。
所以他们是这样声明的:
List<Integer> mMP3s = new ArrayList<Integer>() {
{
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.
}
}
如果您对代码还有疑惑,请看here。我在 github.
上上传了我的代码