作为AndroID基础组件之一,大家对vIEwpager已经很熟悉了,网上也有很多使用vIEwpager来加载图片的案例。但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到。正巧项目中有需求,可以就花时间写了下,现在给一下核心代码,希望对有此需求的同学们起一个抛砖引玉的作用。话不多说了,上代码:
以下是initData的代码
public voID initData() { //把聊天界面的图片和视频找出来,并加到数组中,并在 //并根据传进来的position来找到视频或图片在数组中的位置 for (int i = 0; i < MsgCount; i++) { Msg1 msg1 = frIDenMessages.MessageList.get(i); if (msg1.getMsg().startsWith(ChatUtil.TAG_IMAGE) || msg1.getMsg().startsWith(ChatUtil.TAG_VIDEO)) { ImageUrl.add(msg1.getMsg()); //查看消息postion对应的图片位置 if (position == i) { position = ImageUrl.size() - 1; Log.i("TAG","position=" + position); } } } Log.i("TAG","position=" + position); //把要用到的vIEw加到vIEwList中 for (int i = 0; i < ImageUrl.size(); i++) { if (ImageUrl.get(i).startsWith(ChatUtil.TAG_IMAGE)) { PhotoVIEw photoVIEw = new PhotoVIEw(context); vIEwList.add(photoVIEw); } else if (ImageUrl.get(i).startsWith(ChatUtil.TAG_VIDEO)) { VIEw vIEw1 = LayoutInflater.from(context).inflate(R.layout.activity_vIDeo_player,null); SurfaceVIDeoVIEw vIDeoVIEw = (SurfaceVIDeoVIEw) vIEw1.findVIEwByID(R.ID.vIDeovIEw); int screenWIDth = getScreenWIDth((Activity) context); int vIDeoHight = (int) (screenWIDth / (MediaRecorderBase.SMALL_VIDEO_WIDTH / (MediaRecorderBase.SMALL_VIDEO_HEIGHT * 1.0f)));// int vIDeoHight = (int) (screenWIDth)*4/3; vIDeoVIEw.getLayoutParams().height = vIDeoHight; vIDeoVIEw.requestLayout(); VIEw playStatus = vIEw1.findVIEwByID(R.ID.play_status); VIEw loading = vIEw1.findVIEwByID(R.ID.loading); vIEwList.add(vIEw1); } } adapter = new MyAdapter(); vIEwPager.setAdapter(adapter); if (position != -1) { vIEwPager.setCurrentItem(position); } }``` public voID initEvent() { //给vIEwPager设置监听 vIEwPager.setonPagechangelistener(new VIEwPager.OnPagechangelistener() { @OverrIDe public voID onPageSelected(int arg0) { int childCount = vIEwPager.getChildCount();//vIEwPager得到页面的数量 //如果不是在原页面,让原来页面的视频停止播放 if(position != arg0){ position=arg0; StopVIDeo(); } // 遍历当前所有加载过的PhotoVIEw,恢复所有图片的默认状态 for (int i = 0; i < childCount; i++) { VIEw childAt = vIEwPager.getChildAt(i); try { if (childAt != null && childAt instanceof PhotoVIEw) { PhotoVIEw photoVIEw = (PhotoVIEw) childAt; photoVIEw.setonPhotoTapListener(new PhotoVIEwAttacher.OnPhotoTapListener() { @OverrIDe public voID onPhotoTap(VIEw vIEw,float x,float y) { finish(); } @OverrIDe public voID onOutsIDePhotoTap() { } }); } } catch (Exception e) { e.printstacktrace(); } } if (ImageUrl.get(position).startsWith(ChatUtil.TAG_VIDEO)) { String body = ChatApplication.dbHelper.getVIDeoSdpath(ImageUrl.get(position)); String url[] = ImageUrl.get(position).substring(ChatUtil.TAG_VIDEO.length()).split("&&"); VIEw childAt = vIEwList.get(arg0); SurfaceVIDeoVIEw vIDeoVIEw = (SurfaceVIDeoVIEw) childAt.findVIEwByID(R.ID.vIDeovIEw); mVIDeoVIEw = vIDeoVIEw; mPlayerStatus = childAt.findVIEwByID(R.ID.play_status); mloading = childAt.findVIEwByID(R.ID.loading); Log.i("TAG","vIDeoUrl=" + body); setVIDeoUrl(body,url); //延迟50ms,让播放器播放视频时,让它暂停 Handler handler = new Handler(); handler.postDelayed(new Runnable() { @OverrIDe public voID run() { StopVIDeo(); } },50); } } @OverrIDe public voID onPageScrolled(int arg0,float arg1,int arg2) { // Todo auto-generated method stub } @OverrIDe public voID onPageScrollStateChanged(int arg0) { // Todo auto-generated method stub } }); } public class MyAdapter extends PagerAdapter { @OverrIDe public int getCount() { return ImageUrl.size(); } @OverrIDe public VIEw instantiateItem(VIEwGroup container,int pos) { Log.i("TAG","pos=" + pos); if (ImageUrl.get(pos).startsWith(ChatUtil.TAG_IMAGE)) { PhotoVIEw photoVIEw = (PhotoVIEw) vIEwList.get(pos); container.addVIEw(photoVIEw,VIEwGroup.LayoutParams.MATCH_PARENT,VIEwGroup.LayoutParams.MATCH_PARENT); String body[] = ImageUrl.get(pos).substring(ChatUtil.TAG_IMAGE.length()).split("&&"); Log.i("TAG","<IMAGE>=" + body[0]); ImageLoader.getInstance().displayImage(body[0],photoVIEw); photoVIEw.setScaleType(ImageVIEw.ScaleType.FIT_CENTER);//设置图片显示为充满全屏 photoVIEw.setonPhotoTapListener(new PhotoVIEwAttacher.OnPhotoTapListener() { @OverrIDe public voID onPhotoTap(VIEw vIEw,float y) { finish(); } @OverrIDe public voID onOutsIDePhotoTap() { } }); // photoVIEw.setonLongClickListener(longClickListener); } else if (ImageUrl.get(pos).startsWith(ChatUtil.TAG_VIDEO)) { VIEw vIEw1 = vIEwList.get(pos); SurfaceVIDeoVIEw VIDeoVIEw = (SurfaceVIDeoVIEw) vIEw1.findVIEwByID(R.ID.vIDeovIEw); int screenWIDth = getScreenWIDth((Activity) context); int vIDeoHight = (int) (screenWIDth / (MediaRecorderBase.SMALL_VIDEO_WIDTH / (MediaRecorderBase.SMALL_VIDEO_HEIGHT * 1.0f)));// int vIDeoHight = (int) (screenWIDth)*4/3; VIDeoVIEw.getLayoutParams().height = vIDeoHight; VIDeoVIEw.requestLayout(); VIEw PlayerStatus = vIEw1.findVIEwByID(R.ID.play_status); VIEw Loading = vIEw1.findVIEwByID(R.ID.loading); VIDeoVIEw.setonPreparedListener(ShowBigPictureActivity.this); VIDeoVIEw.setonPlayStateListener(ShowBigPictureActivity.this); VIDeoVIEw.setonErrorListener(ShowBigPictureActivity.this); VIDeoVIEw.setonClickListener(ShowBigPictureActivity.this); VIDeoVIEw.setonInfoListener(ShowBigPictureActivity.this); VIDeoVIEw.setonCompletionListener(ShowBigPictureActivity.this); container.addVIEw(vIEw1,VIEwGroup.LayoutParams.MATCH_PARENT); String body = ChatApplication.dbHelper.getVIDeoSdpath(ImageUrl.get(pos)); String url[] = ImageUrl.get(pos).substring(ChatUtil.TAG_VIDEO.length()).split("&&"); //找到是点击聊天界面哪个视频进来的,将局部成员,付给类成员 if(pos==position) { mVIDeoVIEw = VIDeoVIEw; mPlayerStatus=PlayerStatus; mloading=Loading; setVIDeoUrl(body,url); } } return vIEwList.get(pos); } @OverrIDe public voID destroyItem(VIEwGroup container,int position,Object object) { container.removeVIEw((VIEw) object); } @OverrIDe public boolean isVIEwFromObject(VIEw vIEw,Object object) { return vIEw == object; } }以下是控制视频播放的接口: public voID onCompletion(MediaPlayer mp) { onStateChanged(false); } @OverrIDe public boolean onError(MediaPlayer mp,int what,int extra) { return false; } @OverrIDe public boolean onInfo(MediaPlayer mp,int extra) { switch (what) { case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING: // 音频和视频数据不正确 ConfigUtil.showShort(context,"视频数据不正确!"); break; case MediaPlayer.MEDIA_INFO_BUFFERING_START: if (!isFinishing()) mVIDeoVIEw.pause(); break; case MediaPlayer.MEDIA_INFO_BUFFERING_END: if (!isFinishing()) mVIDeoVIEw.start(); break; case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: if (DeviceUtils.hasJellyBean()) { mVIDeoVIEw.setBackground(null); } else { mVIDeoVIEw.setBackgroundDrawable(null); } break; } return false;} @OverrIDe public voID onStateChanged(boolean isPlaying) { mPlayerStatus.setVisibility(isPlaying ? VIEw.GONE : VIEw.VISIBLE); } @OverrIDe public voID onPrepared(MediaPlayer mp) { mVIDeoVIEw.setVolume(SurfaceVIDeoVIEw.getSystemVolumn(this)); mVIDeoVIEw.start(); mloading.setVisibility(VIEw.GONE); }
我觉得轮播视频的难点在于vIEwpager只能播放一个视频,而每个vIEwItem都有继承自SurfaceVIEw的SurfaceVIDeoVIEw控件, 我让原先页面的SurfaceVIEdeoVIEw停止播放,并把新页面的SurfaceVIDeoVIEw付给mVIDeoVIEw,然后就可以对选中页面的视频进行控制了。
下面来张效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
以上是内存溢出为你收集整理的Android使用ViewPager加载图片和轮播视频全部内容,希望文章能够帮你解决Android使用ViewPager加载图片和轮播视频所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)