作为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() {@Overridepublic 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() {@Overridepublic void onPhotoTap(View view, float x, float y) {finish();}@Overridepublic 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() {@Overridepublic void run() {StopVideo();}}, 50);}}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}});}public class MyAdapter extends PagerAdapter {@Overridepublic int getCount() {return ImageUrl.size();}@Overridepublic 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() {@Overridepublic void onPhotoTap(View view, float x, float y) {finish();}@Overridepublic 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, 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);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}}
以下是控制视频播放的接口:public void onCompletion(MediaPlayer mp) {onStateChanged(false);}@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {return false;}@Overridepublic boolean onInfo(MediaPlayer mp, int what, 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;
}@Overridepublic void onStateChanged(boolean isPlaying) {mPlayerStatus.setVisibility(isPlaying ? View.GONE : View.VISIBLE);}@Overridepublic void onPrepared(MediaPlayer mp) {mVideoView.setVolume(SurfaceVideoView.getSystemVolumn(this));mVideoView.start();mLoading.setVisibility(View.GONE);}
我觉得轮播视频的难点在于viewpager只能播放一个视频,

而每个viewItem都有继承自SurfaceView的SurfaceVideoView控件,
我让原先页面的SurfaceViedeoView停止播放,并把新页面的SurfaceVideoView付给mVideoView,然后就可以对选中页面的视频进行控制了。
下面来张效果图:

使用ViewPager来加载图片和轮播视频相关推荐

  1. android viewpager动态加载图片,Android使用ViewPager加载图片和轮播视频

    作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例.但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到.正巧项目中有需求 ...

  2. 写一个可以使用kingfisher加载图片的轮播器PPTView

    前言:关于图片轮播的第三方资源已经很多了,其中大多的使用都是很简单方便的, 但是从oc到swift上面来, 就写一写基本的常用的"控件"当作熟悉吧, 如果在这个过程中能帮到一些正在 ...

  3. react-ueditor-xiumi,秀米编辑器首次加载图片上传,视频上传无法使用问题

    在项目中引入秀米编辑器出现了首次加载图片上传和视频上传无法使用的问题 问题情况: 正常情况: 这种情况仅存在于首次加载,控制台查看元素样式,发现编辑器每次展示和隐藏,元素的id是增加的,也就是说每次隐 ...

  4. Gilde加载网络图片+Banner轮播图

    Glide详细介绍 Glide介绍 主页面布局 <com.youth.banner.Bannerandroid:id="@+id/banner"android:layout_ ...

  5. Android:ViewPager详解(异步网络加载图片,带图片缓存,并带导航小圆点)

    android 应用中,如欢迎指引页面, 和图片轮播功能, 或者更多的内容在一页显示不了,要分成多个页面,这时候viewpager是很好用的. 首先看下效果: 下面是一个例子,带异步网络加载图片,并带 ...

  6. Android的轮播图Banner之本地加载和网络加载图片(含demo)

    前言 关于轮播图 我个人是比较喜欢 闲来无事的时候 可以整理自己的照片 做一个demo 看看动态的效果 挺不错的! 每个App也基本都有一些广告位置 只要打开这个页面就会无限轮播广告图片 看多了我们也 ...

  7. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...

    本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...

  8. 微信小程序开发实战基础一、页面跳转,底部导航栏,分享,加载图片标签,列表

    1.页面跳转 wx.navigateTo({ url: "../four/four" })--可返回 wx.redirectTo({ url: "../four/four ...

  9. ImageLoader加载图片与文字

    //main方法 import android.support.annotation.IdRes; import android.support.v4.app.Fragment; import and ...

最新文章

  1. tc写入txt成功却没有内容_挖洞经验 | 构造UserAgent请求头内容实现LFI到RCE提权
  2. java课程实战培训,终获offer
  3. PHP和ajax详解
  4. Spring 开启Annotation context:annotation-config 和 context:component-scan诠释及区别
  5. SAP Spartacus List Component 里定义的待显示 Popover 内容,如何传递到 Popover Component 里的?
  6. C .Adding Powers codeforces(位运算思维)
  7. 数据结构与算法-- 二叉树中和为某一值的路径
  8. Java适配器的设计模式
  9. java执行程序默认多线程吗_Java多线程 执行程序(1)
  10. 2017年网络犯罪现状分析报告
  11. python如何在列表中查找元素位置_查找元素在list中的位置以及折半查询
  12. UILAbel 设置了attributedText 后省略号不显示
  13. 09月28日 pytorch与resnet(三)预训练的Mask R-CNN 模型进行微调
  14. python基础(12):Standard Library标准库(包含正则)
  15. erf和erfc函数
  16. split 逗号或分号_分号或不分号
  17. 代码实现Thompson构造:由简单到复杂的构建NFA状态机
  18. 论以建筑全生命周期管理建设公司大数据平台
  19. kvm安装Windows7旗舰版
  20. NUC系列迷你电脑改装苹果网卡的又一神器方案

热门文章

  1. 硅谷创业群英和个人及计算机的崛起历史
  2. SpringBoot2.x系列教程(四十八)Spring Boot集成JDBCTemplate
  3. android微信分享工具,记录Android微信分享功能的吐槽与思考
  4. 2022年招聘趋势:研发科技岗位薪水涨幅大;医疗健康上演“抢人大战”;混合办公吸引保留优秀人才 | 美通社头条...
  5. oracle数据库创建库并使用库,docker, oracle创建空间表,创建数据库。
  6. 股票交易系统推荐杨方配资_股票交易系统_杨方配资平台_
  7. 如何来制作公司组织结构图
  8. ​无线AP的知识点介绍
  9. 智能化无线网关安全审计系统
  10. 因子分解算法——Pollard 的p-1方法