当前位置:主页 > android教程 > ViewPager2轮播图效果

使用ViewPager2实现简易轮播图效果

发布:2023-03-04 18:00:01 59


本站精选了一篇相关的编程文章,网友储梓童根据主题投稿了本篇教程内容,涉及到ViewPager2、轮播图、ViewPager2轮播图效果相关内容,已被455网友关注,内容中涉及的知识点可以在下方直接下载获取。

ViewPager2轮播图效果

本文实例为大家分享了使用ViewPager2实现轮播图效果的具体代码,供大家参考,具体内容如下

0.实现效果

1.添加依赖

dependencies {
    ...
    implementation 'androidx.viewpager2:viewpager2:1.0.0'
}

2.设计布局

使用CardView实现圆角的效果,并在父布局的右下角放一个线性布局,用来动态添加指示点。




    

        

            

        

        

     

3.实现Adapter

ViewPager2是使用RecyclerView实现的,适配器的写法与使用RecyclerView类似。
要实现"无限"轮播,需要在getItemCount()方法中返回一个较大的值,这里返回的是Integer.MAX_VALUE.




    

public class ViewPagerAdapter extends RecyclerView.Adapter {

    private List colors;

    ViewPagerAdapter(List colors){
        this.colors = colors;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        int i = position % 4;
        holder.titleTv.setText("item " + i);
        holder.container.setBackgroundColor(colors.get(i));
    }

    @Override
    public int getItemCount() {
        //实现无限轮播
        return Integer.MAX_VALUE;
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        RelativeLayout container;
        TextView titleTv;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            container = itemView.findViewById(R.id.container);
            titleTv = itemView.findViewById(R.id.tv_title);
        }
    }
}

4.绘制指示点

绘制一个白色的点和一个蓝色的点用于指示。



    
    
    


    
    
    

5.实现

public class MainActivity extends AppCompatActivity {

    private ViewPager2 viewPager2;
    private int lastPosition;                           //记录轮播图最后所在的位置
    private List colors = new ArrayList<>();   //轮播图的颜色
    private LinearLayout indicatorContainer;            //填充指示点的容器
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化组件
        viewPager2 = findViewById(R.id.viewpager2);
        indicatorContainer = findViewById(R.id.container_indicator);

        initColors();
        //初始化指示点
        initIndicatorDots();
        
        //添加适配器
        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(colors);
        viewPager2.setAdapter(viewPagerAdapter);
        //设置轮播图初始位置在500,以保证可以手动前翻
        viewPager2.setCurrentItem(500);
        //最后所在的位置设置为500
        lastPosition = 500;
    
        //注册轮播图的滚动事件监听器
        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {

            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                //轮播时,改变指示点
                int current = position % 4;
                int last = lastPosition % 4;
                indicatorContainer.getChildAt(current).setBackgroundResource(R.drawable.shape_dot_selected);
                indicatorContainer.getChildAt(last).setBackgroundResource(R.drawable.shape_dot);
                lastPosition = position;
            }
        });
    }

    private void initColors(){
        colors.add(Color.BLUE);
        colors.add(Color.YELLOW);
        colors.add(Color.GREEN);
        colors.add(Color.RED);
    }

    /**
     * 初始化指示点
     */
    private void initIndicatorDots(){
        for(int i = 0; i < colors.size(); i++){
            ImageView imageView = new ImageView(this);
            if (i == 0) imageView.setBackgroundResource(R.drawable.shape_dot_selected);
            else imageView.setBackgroundResource(R.drawable.shape_dot);
            //为指示点添加间距
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
            layoutParams.setMarginEnd(4);
            imageView.setLayoutParams(layoutParams);
            //将指示点添加进容器
            indicatorContainer.addView(imageView);
        }
    }

    /* 当应用被唤醒时,让轮播图开始轮播 */
    @Override
    protected void onResume() {
        super.onResume();
        mHandler.postDelayed(runnable,5000);
    }

    /* 当应用被暂停时,让轮播图停止轮播 */
    @Override
    protected void onPause() {
        super.onPause();
        mHandler.removeCallbacks(runnable);
    }    private final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            //获得轮播图当前的位置
            int currentPosition = viewPager2.getCurrentItem();
            currentPosition++;
            viewPager2.setCurrentItem(currentPosition,true);
            mHandler.postDelayed(runnable,5000);
        }
    };

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


参考资料

相关文章

  • android实现轮播图引导页

    发布:2023-03-05

    这篇文章主要为大家详细介绍了android实现轮播图引导页,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • ViewPager实现轮播图引导页

    发布:2023-03-05

    这篇文章主要为大家详细介绍了ViewPager实现轮播图引导页,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • js轮播图透明度切换实例代码

    发布:2019-11-03

    本篇文章主要介绍了js轮播图透明度切换(带上下页和底部圆点切换)的实例。具有很好的参考价值。下面跟着小编一起来看下吧


  • Android ViewPager2 使用及自定义指示器视图实现

    发布:2023-03-10

    这篇文章主要为大家介绍了Android ViewPager2 使用及自定义指示器视图实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • 微信小程序视图容器创建轮播图实例

    发布:2019-12-03

    这篇文章主要为大家详细介绍了微信小程序视图容器(swiper)组件创建轮播图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • jquery实现PC端轮播图代码分享

    发布:2020-05-25

    本篇文章主要给大家讲述了用jquery如何写出一个PC端的轮播图效果的实例,有兴趣的朋友参考下。


  • jQuery左右滚动支持图片放大缩略图轮播实例代码

    发布:2019-12-07

    这篇文章主要介绍了jQuery左右滚动支持图片放大缩略图图片轮播效果,推荐给大家,有需要的小伙伴可以参考下。


  • TabLayout+ViewPager2的简单使用详解

    发布:2023-03-05

    这篇文章主要为大家详细介绍了TabLayout+ViewPager2的简单使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


网友讨论