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