我按照下面的教程(向下滚动到“全屏图像幻灯片”部分)来实现全屏幻灯片,除了在幻灯片中使用图像,我正在使用视频:
http://www.androidhive.info/2016/04/android-glide-image-library-building-image-gallery-app/
这是我对DialogFragment和PagerAdapter的实现:
public class SlideshowDialogFragment extends DialogFragment {
private ArrayList<Video> videos;
private ViewPager viewPager;
private MyViewPagerAdapter myViewPagerAdapter;
private int selectedPosition = 0;
public static SlideshowDialogFragment newInstance() {
SlideshowDialogFragment fragment = new SlideshowDialogFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_slideshow, container, false);
videos = (ArrayList<Video>) getArguments().getSerializable("videos");
selectedPosition = getArguments().getInt("position");
viewPager = (ViewPager) v.findViewById(R.id.viewPager);
myViewPagerAdapter = new MyViewPagerAdapter();
viewPager.setAdapter(myViewPagerAdapter);
setCurrentItem(selectedPosition);
return v;
}
private void setCurrentItem(int position) {
viewPager.setCurrentItem(position, false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
public class MyViewPagerAdapter extends PagerAdapter {
private LayoutInflater layoutInflater;
public MyViewPagerAdapter() {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.video_layout, container, false);
Video video = videos.get(position);
TextureVideoView videoView = (TextureVideoView) view.findViewById(R.id.videoView);
Uri videoUri = Uri.parse(video.getUrl());
videoView.setVideoURI(videoUri);
videoView.setMediaController(null);
videoView.requestFocus();
container.addView(view);
return view;
}
@Override
public int getCount() {
return videos.size();
}
@Override
public boolean isViewFromObject(View view, Object obj) {
return view == ((View) obj);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
}
现在的问题是,视频加载后会自动播放。而且,因为ViewPager加载了下一张和上一张幻灯片(我希望它能够做到),幻灯片也会自动播放下一张和之前的视频(我不希望它做)。
所以我的问题是,如何修改我的代码以便它只在当前幻灯片处于活动状态时播放视频,然后在幻灯片变为非活动状态时暂停/停止视频?
仅供参考:开始和停止视频的方法有videoView.start()
和videoView.stop()
。
答案 0 :(得分:0)
您可以在我的其他答案here中使用相同的方法。
在ViewPager适配器中保留一组视频视图引用,以便您可以启动当前显示的视频,并暂停所有实例化但当前未显示的视频视图。
对适配器的更改:
public class MyViewPagerAdapter extends PagerAdapter {
private LayoutInflater layoutInflater;
//Added:
public TextureVideoView[] videoViews = new TextureVideoView[videos.size()];
public MyViewPagerAdapter() {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.video_layout, container, false);
Video video = videos.get(position);
TextureVideoView videoView = (TextureVideoView) view.findViewById(R.id.videoView);
Uri videoUri = Uri.parse(video.getUrl());
videoView.setVideoURI(videoUri);
videoView.setMediaController(null);
videoView.requestFocus();
container.addView(view);
//Added:
videoViews[position] = videoView;
return view;
}
//.............
}
然后,在适配器外部,使用ViewPager.OnPageChangeListener
启动当前视频,并暂停两侧的视频:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
for (int i = 0; i < videos.size(); i++) {
TextureVideoView videoView = myViewPagerAdapter.videoViews[i];
if (videoView == null) continue;
if (i == position) {
videoView.start();
} else {
videoView.stop();
}
}
}
@Override
public void onPageScrollStateChanged(int state) { }
});