Android使用ViewPager加载图片和轮播视频

作为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 x, 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, 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 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;
}

 @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,然后就可以对选中页面的视频进行控制了。

下面来张效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件

    最近用到需要无限轮播自动播放的轮播轮播图,网上感觉都有这样那样的问题,于是自己写了一个通用的控件CarouselFigureView. 特点: 1.可以轮播view可以自己定义,不一定是要是ImageView2.指示器默认显示,但是可以隐藏3.可以设置指示器的颜色.间距.大小 4.有基础的可以自己修改代码改变指示器位置,这个应该不难5.可以自己开启和关闭自动轮播,开启轮播的时候可以设置轮播时间间隔,默认3000毫秒 我们先来看看效果图: 然后来看看使用代码 xml代码 <?xml version

  • android ViewPager实现自动无限轮播和下方向导圆点

    一.布局 小圆点形状的生成shape.xml文件 使用空心还是实心的把对应的注释去掉就可以了. <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" android:useLevel="false&quo

  • Android 使用ViewPager实现左右循环滑动及轮播效果

    ViewPager是一个常用的Android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其他页面的信息. 循环滑动效果的实现:PagerAdapter 我们知道ViewPager自带的滑动效果非常出色,因此我们基本不需要处理这个滑动,只处理内容的显示.而内容的显示是由

  • Android ViewPager实现轮播图效果

    先上一张效果图: 说到ViewPager实现轮播图效果,那么肯定会用到PagerAdapter,下面先介绍下这个类. PagerAdapter简介 PagerAdapter是Android.support.v4包中的类,是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件

  • Android中用RxJava和ViewPager实现轮播图

    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果.但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了. 下面我们就来介绍如何实现RxJava+ViewPager的轮播图. 效果图如下 ViewPager的操作 说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用.在此我也就不对它的使用方法进行过多的介绍了.直接开始介绍轮播的方法. 常见的轮播操作 private

  • Android使用ViewPager实现自动轮播

    很多APP中都实现了类似引导页的自动轮播,不由得想到昨天的引导页上修改一下代码实现轮播. 其实大体上只需要添加一个线程循环执行就可以了. 项目已同步至:https://github.com/nanchen2251/viewpagerDemo 同样的先上图 直接上代码,注释都全的,我想这样更有利于理解. 先改了Adapter  package com.example.nanchen.taketurnplaydemo; import android.support.v4.view.PagerAdap

  • Android 使用ViewPager自动滚动循环轮播效果

    对Android 利用ViewPager实现图片可以左右循环滑动效果,感兴趣的朋友可以直接点击查看内容详情. 主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用.顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题. 先给大家展示下效果图,喜欢的朋友可以下载源码: 1.实现 没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去

  • Android viewpager自动轮播和小圆点联动效果

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 首先来看一下我们要做成的而效果: 主页面要显示一个viewpager自动轮播+小圆点联动的效果 : 废话不多说,直接上代码: 布局文件: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

  • Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie

  • Android ViewPager实现图片轮播效果

    在app中图片的轮播显示可以说是非常常见的实现效果了,其实现原理不过是利用ViewPager,然后利用handler每隔一定的时间将ViewPager的currentItem设置为当前item的position+1即可.先来看看效果图吧: 就是实现这样的一个轮播广告的效果. 因为这个是自己为了练习仿照某旅游类App做的,所以这里的数据是使用抓包工具抓取的,准备数据等工作就不在这里赘述了,反正数据的添加大体都是相同的.我的思路是这样的,从网络上实时的获取数据(当然你也可以将数据写死),然后通过网络

随机推荐