Android随笔-ViewPager2

概述

ViewPager2常用于可以滑动的视图或 Fragment。
ViewPager与ViewPager2的区别:

  1. ViewPager2内部是用RecyclerView实现的,性能更高。
  2. ViewPager2可以横向滑动,也可以竖向滑动,ViewPager只能横向滑动。
  3. ViewPager2默认使用了懒加载,不进行预加载。
  4. ViewPager2和Fragment联合使用的时候,只能使用FragmentStateAdapter,FragmentStateAdapter继承自RecyclerView.Adapter,FragmentStateAdapter进行预加载时,只会创建Fragment对象,并不会将其添加到布局中。
  5. ViewPager可以使用FragmentStatePagerAdapter和FragmentPagerAdapter,两者都继承自PagerAdapter,其中FragmentStatePagerAdapter不可以缓存,而FragmentPagerAdapter可以缓存。
  6. ViewPager2可以通过Lifecycle 对 Fragment 的生命周期进行管理。

导入

implementation "androidx.viewpager2:viewpager2:1.0.0"

布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tab_layout" />

</androidx.constraintlayout.widget.ConstraintLayout>

setAdapter

    // 标题
    private String[] titles = {"Tab0", "Tab1", "Tab2", "Tab3", "Tab4", "Tab5", 
    "Tab6", "Tab7",};
    // 颜色
    private int[] colors = {R.color.black, R.color.blue, R.color.yellow, 
    R.color.pink, R.color.red, R.color.green, R.color.orange, R.color.purple};
    // fragment
    private Fragment[] fragments = new Fragment[8];
    ...
        for (int i = 0; i < 8; i++) {
            fragments[i] = ViewPagerFragment.newInstance(titles[i], colors[i]);
        }    
        // ORIENTATION_HORIZONTAL:水平滑动(默认),ORIENTATION_VERTICAL:竖直滑动
        viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
        // 适配
        viewPager2.setAdapter(new FragmentStateAdapter(getSupportFragmentManager(),getLifecycle()) {
            @NonNull
            @Override
            public Fragment createFragment(int position) {
                return fragments[position];
            }

            @Override
            public int getItemCount() {
                return fragments.length;
            }
        });

联动

        // tab可以滑动的
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        // tabLayout与viewPager2联动
        new TabLayoutMediator(tabLayout,viewPager2, (tab, position) -> {
            TextView textView = new TextView(this);
            // tab标题
            textView.setText(titles[position]);
            // tab颜色
            textView.setTextColor(getResources().getColor(colors[position]));
            // tab字体大小
            textView.setTextSize(24.0f);
            tab.setCustomView(textView);

        }).attach();

效果

SVID_20220831_163550_1

轮播图

        viewPager2.setAdapter(new RecyclerView.Adapter() {
            @NonNull
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                // 布局
                return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_vp, parent, false));
            }

            @Override
            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                // 内容
                ViewHolder viewHolder = (ViewHolder) holder;
                viewHolder.item.setText("Banner" + position);
                viewHolder.item.setBackgroundColor(colors[position]);
            }

            @Override
            public int getItemCount() {
                // 长度
                return titles.length;
            }


            class ViewHolder extends RecyclerView.ViewHolder {
                TextView item;
                
                public ViewHolder(@NonNull View itemView) {
                    super(itemView);
                    item = itemView.findViewById(R.id.tv_item);
                }
            }
        });

效果

SVID_20220831_170531_1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 Android 中使用 ExoPlayer2ViewPager2 播放视频,需要以下步骤: 1. 安装 ExoPlayer2 库:在 build.gradle 文件中添加以下依赖项: ``` implementation 'com.google.android.exoplayer:exoplayer:2.X.X' ``` 2. 创建一个 ExoPlayer2 实例:在您的 Activity 或 Fragment 中创建一个 ExoPlayer 实例,并设置要播放的媒体文件。 3. 创建一个 ExoPlayerView:在您的布局文件中创建一个 ExoPlayerView 并将其与 ExoPlayer 实例关联。 4. 创建一个 ViewPager2:在您的布局文件中创建一个 ViewPager2,并将其填充为包含 ExoPlayerView 的 Fragment。 5. 设置 ViewPager2 适配器:创建一个适配器并将其与 ViewPager2 关联,以显示每个 Fragment。 这些步骤将为您提供一个可在 ViewPager2 中播放视频的基础架构。根据您的需求,您可以对代码进行进一步的调整。 ### 回答2: Android ExoPlayer2 是一款强大的视频播放器库,而 ViewPager2 则是一个用于实现滑动页面的视图容器。结合这两个库,可以实现在 ViewPager2 内播放视频的功能。 首先,我们需要在布局文件中定义一个 ViewPager2 控件,并在适当的时候,将视频的 URL 或本地路径传递给适配器。接着,在适配器中,我们可以使用 ExoPlayer2 创建一个播放器对象,并将视频源设置为这个播放器。 在 ViewPager2 的适配器中,我们需要实现以下方法: 1. `onCreateViewHolder`:用于创建 RecyclerView.ViewHolder,即每个页面的视图。 2. `onBindViewHolder`:用于将数据与视图绑定在一起,例如设置视频的 URL 或本地路径。 3. `onViewAttachedToWindow`:在视图被添加到窗口时被调用,我们可以在这个方法内初始化和启动播放器。 4. `onViewDetachedFromWindow`:在视图从窗口中移除时被调用,我们可以在这个方法内释放播放器资源。 在 `onViewAttachedToWindow` 方法中,我们可以执行以下步骤来初始化和启动播放器: 1. 创建一个 SimpleExoPlayer 实例。 2. 创建一个 DefaultTrackSelector,并将其应用在播放器上。 3. 为播放器设置 MediaSource,即视频资源。可以使用三种 MediaSource:HLS、DASH 和普通的 progressive。 4. 将 SurfaceView 添加到视图中,并通过 `exoPlayer.setVideoSurfaceView(surfaceView);` 将其附加到播放器上。 5. 最后,调用 `exoPlayer.prepare()` 和 `exoPlayer.setPlayWhenReady(true)`,分别用于准备播放和自动播放视频。 在 `onViewDetachedFromWindow` 方法中,我们可以执行以下步骤来释放播放器资源: 1. 调用 `exoPlayer.setPlayWhenReady(false)`,暂停播放器。 2. 调用 `exoPlayer.release()`,释放播放器资源。 通过这种方式,我们可以在 ViewPager2 中实现视频的滑动播放功能。每次滑动到一个新的页面时,我们可以在 `onViewAttachedToWindow` 方法中初始化和启动播放器,在离开页面时,在 `onViewDetachedFromWindow` 方法中释放播放器资源。这样,我们可以平滑地在 ViewPager2 中切换播放的视频内容。 ### 回答3: Android ExoPlayer2是一个功能强大的用于播放视频和音频的开源库。ViewPager2是一个支持左右滑动切换页面的控件。将这两个库结合起来,可以实现在ViewPager2中播放视频的功能。 首先,需要在项目的build.gradle文件中添加ExoPlayer2ViewPager2的依赖库。通过在dependencies中添加以下代码,引入所需的库: ```groovy implementation 'com.google.android.exoplayer:exoplayer:2.x.x' implementation 'androidx.viewpager2:viewpager2:1.0.0' ``` 然后,在ViewPager2的Adapter中创建一个自定义的Fragment,并在该Fragment中添加ExoPlayer2的播放器用来播放视频。在该Fragment的布局文件中,可以添加一个用于显示视频画面的SurfaceView或TextureView。 在Fragment中,需要初始化ExoPlayer2的播放器实例,并设置要播放的视频资源。可以通过以下代码实现: ```java // 在Fragment中初始化ExoPlayer2的播放器实例 SimpleExoPlayer exoPlayer = new SimpleExoPlayer.Builder(context).build(); // 设置要播放的视频资源 Uri videoUri = Uri.parse("视频资源的URL或本地路径"); MediaSource mediaSource = new ProgressiveMediaSource.Factory( new DefaultDataSourceFactory(context, "Your Application Name")) .createMediaSource(videoUri); exoPlayer.prepare(mediaSource); ``` 在ViewPager2的Adapter中,创建一个List来保存所有的Fragment,以便在ViewPager2中展示。在Activity中,创建一个ViewPager2的实例,并设置Adapter和页面切换监听器,如下所示: ```java ViewPager2 viewPager2 = findViewById(R.id.viewPager2); ViewPager2Adapter adapter = new ViewPager2Adapter(fragmentList); viewPager2.setAdapter(adapter); // 添加页面切换监听器 viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { super.onPageSelected(position); // 当页面切换时,暂停之前页面的视频播放 exoPlayer.setPlayWhenReady(false); } }); ``` 通过以上步骤,就可以在ViewPager2中播放视频了。需要注意的是,在页面切换时,可以通过设置exoPlayer.setPlayWhenReady(false)来暂停之前页面的视频播放,保证用户在切换页面时不会同时播放多个视频。 希望可以帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值