ImageView 滑块中的 MediaPlayer 释放问题
MediaPlayer release problem in ImageView slider
我有以下适配器 class。谁能告诉我在哪里以及如何释放声音,以便在新图像上停止播放声音?
我的想法是在 Obj1 图像 上播放 Obj1
声音,在 Obj2 图像 上播放 Obj2
声音,依此类推,并在另一个开始播放时发出声音。
当前正在播放正确图像的正确声音,但是当我滑动图像时,上一个视图的声音仍在与当前视图声音一起播放。
public class MyPagerAdapter extends PagerAdapter {
Context My_context;
LayoutInflater My_inflater;
MediaPlayer MyObj1_mp3, MyObj2_mp3, MyObj3_mp3, MyObj4_mp3;
public int[] My_images = { R.drawable.MyObj1,R.drawable.MyObj2,R.drawable.MyObj3,R.drawable.MyObj4 };
public String[] My_title = { "MyObj1","MyObj2","MyObj3","MyObj4" };
public MyPagerAdapter(Context My_context) { this.My_context = My_context; }
@Override
public int getCount() { return My_title.length; }
@Override
public boolean isViewFromObject(View view, Object object) { return (view==(ConstraintLayout)object); }
@Override
public Object instantiateItem(ViewGroup container, final int My_position) {
My_inflater = (LayoutInflater) My_context.getSystemService(My_context.LAYOUT_INFLATER_SERVICE);
View view = My_inflater.inflate(R.layout.activity_My_custlayout,container,false);
ConstraintLayout My_constraint_layout = (ConstraintLayout) view.findViewById(R.id.constraint_layout_My);
ImageView My_slide = (ImageView) view.findViewById(R.id.MyView);
TextView My_text= (TextView) view.findViewById(R.id.My_txt);
My_slide.setImageResource(My_images[My_position]);
My_text.setText(My_title[My_position]);
MyObj1_mp3 = MediaPlayer.create(My_context,R.raw.MyObj1);
MyObj2_mp3 = MediaPlayer.create(My_context,R.raw.MyObj2);
MyObj3_mp3 = MediaPlayer.create(My_context,R.raw.MyObj3);
MyObj4_mp3 = MediaPlayer.create(My_context,R.raw.MyObj4);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (My_position == 0){ MyObj1_mp3.start(); }
else if (My_position == 1){ MyObj2_mp3.start(); }
else if (My_position == 2){ MyObj3_mp3.start(); }
else { MyObj4_mp3.start();}
}
});
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{ container.removeView((ConstraintLayout)object); }
}
我认为,您应该将 MediaPlayer 操作移动到您调用 PagerAdapter.you 的地方,应该实现 ViewPager.OnPageChangeListener 到寻呼机 instance.In 这样,您可以收听当前项目的索引。当改变当前项目的索引时,你可以改变声音。
我想使用多个 MediaPlayer 实例是不正确的,因为您希望一次只播放其中一个;因此您可以使用单个 MediaPlayer 实例。
因此,您可以删除 MyObj1_mp3、MyObj2_mp3、MyObj3_mp3、& MyObj4_mp3,然后只创建 mediaPlayer
。
每次你想播放原始资源时,只需释放 mediaPlayer 资源并用新资源重复创建即可。您可以只创建一个将该资源作为参数的方法。
因此,删除以下内容:
MyObj1_mp3 = MediaPlayer.create(My_context,R.raw.MyObj1);
MyObj2_mp3 = MediaPlayer.create(My_context,R.raw.MyObj2);
MyObj3_mp3 = MediaPlayer.create(My_context,R.raw.MyObj3);
MyObj4_mp3 = MediaPlayer.create(My_context,R.raw.MyObj4);
并添加:
@Override
public Object instantiateItem(ViewGroup container, final int My_position) {
// ..... rest of code
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
releaseMediaPlayer();
if (My_position == 0){ setupMediaPlayer(R.raw.MyObj1); }
else if (My_position == 1){ setupMediaPlayer(R.raw.MyObj2); }
else if (My_position == 2){ setupMediaPlayer(R.raw.MyObj3); }
else { setupMediaPlayer(R.raw.MyObj4); }
}
});
}
private void setupMediaPlayer(int resource) {
// add track file
mediaPlayer = MediaPlayer.create(My_context, resource);
mediaPlayer.start();
}
private void releaseMediaPlayer() {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
我有以下适配器 class。谁能告诉我在哪里以及如何释放声音,以便在新图像上停止播放声音?
我的想法是在 Obj1 图像 上播放 Obj1
声音,在 Obj2 图像 上播放 Obj2
声音,依此类推,并在另一个开始播放时发出声音。
当前正在播放正确图像的正确声音,但是当我滑动图像时,上一个视图的声音仍在与当前视图声音一起播放。
public class MyPagerAdapter extends PagerAdapter {
Context My_context;
LayoutInflater My_inflater;
MediaPlayer MyObj1_mp3, MyObj2_mp3, MyObj3_mp3, MyObj4_mp3;
public int[] My_images = { R.drawable.MyObj1,R.drawable.MyObj2,R.drawable.MyObj3,R.drawable.MyObj4 };
public String[] My_title = { "MyObj1","MyObj2","MyObj3","MyObj4" };
public MyPagerAdapter(Context My_context) { this.My_context = My_context; }
@Override
public int getCount() { return My_title.length; }
@Override
public boolean isViewFromObject(View view, Object object) { return (view==(ConstraintLayout)object); }
@Override
public Object instantiateItem(ViewGroup container, final int My_position) {
My_inflater = (LayoutInflater) My_context.getSystemService(My_context.LAYOUT_INFLATER_SERVICE);
View view = My_inflater.inflate(R.layout.activity_My_custlayout,container,false);
ConstraintLayout My_constraint_layout = (ConstraintLayout) view.findViewById(R.id.constraint_layout_My);
ImageView My_slide = (ImageView) view.findViewById(R.id.MyView);
TextView My_text= (TextView) view.findViewById(R.id.My_txt);
My_slide.setImageResource(My_images[My_position]);
My_text.setText(My_title[My_position]);
MyObj1_mp3 = MediaPlayer.create(My_context,R.raw.MyObj1);
MyObj2_mp3 = MediaPlayer.create(My_context,R.raw.MyObj2);
MyObj3_mp3 = MediaPlayer.create(My_context,R.raw.MyObj3);
MyObj4_mp3 = MediaPlayer.create(My_context,R.raw.MyObj4);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (My_position == 0){ MyObj1_mp3.start(); }
else if (My_position == 1){ MyObj2_mp3.start(); }
else if (My_position == 2){ MyObj3_mp3.start(); }
else { MyObj4_mp3.start();}
}
});
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{ container.removeView((ConstraintLayout)object); }
}
我认为,您应该将 MediaPlayer 操作移动到您调用 PagerAdapter.you 的地方,应该实现 ViewPager.OnPageChangeListener 到寻呼机 instance.In 这样,您可以收听当前项目的索引。当改变当前项目的索引时,你可以改变声音。
我想使用多个 MediaPlayer 实例是不正确的,因为您希望一次只播放其中一个;因此您可以使用单个 MediaPlayer 实例。
因此,您可以删除 MyObj1_mp3、MyObj2_mp3、MyObj3_mp3、& MyObj4_mp3,然后只创建 mediaPlayer
。
每次你想播放原始资源时,只需释放 mediaPlayer 资源并用新资源重复创建即可。您可以只创建一个将该资源作为参数的方法。
因此,删除以下内容:
MyObj1_mp3 = MediaPlayer.create(My_context,R.raw.MyObj1);
MyObj2_mp3 = MediaPlayer.create(My_context,R.raw.MyObj2);
MyObj3_mp3 = MediaPlayer.create(My_context,R.raw.MyObj3);
MyObj4_mp3 = MediaPlayer.create(My_context,R.raw.MyObj4);
并添加:
@Override
public Object instantiateItem(ViewGroup container, final int My_position) {
// ..... rest of code
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
releaseMediaPlayer();
if (My_position == 0){ setupMediaPlayer(R.raw.MyObj1); }
else if (My_position == 1){ setupMediaPlayer(R.raw.MyObj2); }
else if (My_position == 2){ setupMediaPlayer(R.raw.MyObj3); }
else { setupMediaPlayer(R.raw.MyObj4); }
}
});
}
private void setupMediaPlayer(int resource) {
// add track file
mediaPlayer = MediaPlayer.create(My_context, resource);
mediaPlayer.start();
}
private void releaseMediaPlayer() {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}