当前位置: 首页 > web >正文

Android实现轮播图

效果图

实现

1、xml布局

<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="100dp"><!--  轮播图  --><androidx.viewpager.widget.ViewPagerandroid:id="@+id/viewPager_carousel"android:layout_width="match_parent"android:layout_height="match_parent" /><!--  轮播图底部滑动状态按钮  --><LinearLayoutandroid:id="@+id/dotsLayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal"android:padding="10dp"android:layout_alignParentBottom="true"/></RelativeLayout>

2、新建一个adapter

package com.example.lives.adapters;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import com.example.lives.R;import java.util.ArrayList;
import java.util.List;public class ImagePagerAdapter extends PagerAdapter {private Context mContext;private List<Integer> mImageList;/*** 构造函数,初始化上下文和图片资源列表* @param context 上下文*/public ImagePagerAdapter(Context context) {mContext = context;mImageList = new ArrayList<>();// 添加图片资源 IDmImageList.add(R.mipmap.csgo);mImageList.add(R.mipmap.csgo2);mImageList.add(R.mipmap.csgo3);}/*** 获取图片数量* @return 图片数量*/@Overridepublic int getCount() {return mImageList.size();}/*** 检查视图是否与指定的对象相关联* @param view 视图* @param object 对象* @return 是否相关联*/@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {return view == object;}/*** 实例化指定位置的视图* @param container 容器* @param position  位置*  @return 视图*/@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {View view = LayoutInflater.from(mContext).inflate(R.layout.item_image, container, false);ImageView imageView = view.findViewById(R.id.iv_image);imageView.setImageResource(mImageList.get(position));container.addView(view);return view;}/*** 销毁指定位置的视图* @param container 容器* @param position  位置* @param object    对象*/@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {container.removeView((View) object);}
}

3、在avtivity中初始化(我这里是在fragment中用的,用法一样的)

private LinearLayout dotsLayout;
private ImagePagerAdapter adapter;
private int currentPage = 0; // 当前显示的页面索引
private Timer timer;
private final long DELAY_MS = 500; // 轮播图自动播放的延迟时间,单位为毫秒。设置为 500 毫秒意味着在页面加载完成 500 毫秒后开始自动播放轮播图
private final long PERIOD_MS = 2000; // 轮播图自动播放的时间间隔,单位为毫秒。设置为 3000 毫秒意味着每 3 秒切换一次轮播图
private final int DOT_COUNT = 3; // 轮播图圆点的数量,根据你的轮播图图片数量调整public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_profile, container, false);// 绑定组件,初始化数据viewPager = view.findViewById(R.id.viewPager_carousel);dotsLayout = view.findViewById(R.id.dotsLayout);adapter = new ImagePagerAdapter(getActivity());viewPager.setAdapter(adapter);// 初始化轮播图圆点addDots();// 监听 轮播图 页面变化viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {currentPage = position;updateDots(position);}@Overridepublic void onPageScrollStateChanged(int state) {}});// 自动播放轮播图startAutoPlay();return view;}/*** 初始化轮播图圆点*/private void addDots() {ImageView[] dots = new ImageView[DOT_COUNT];for (int i = 0; i < DOT_COUNT; i++) {dots[i] = new ImageView(getActivity());LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);params.setMargins(8, 0, 8, 0);dots[i].setLayoutParams(params);dots[i].setImageResource(R.drawable.dot_inactive);dotsLayout.addView(dots[i]);}// 设置第一个圆点为激活状态if (dots.length > 0) {dots[0].setImageResource(R.drawable.dot_active);}}/*** 更新轮播图圆点* @param position 当前位置*/private void updateDots(int position) {for (int i = 0; i < DOT_COUNT; i++) {ImageView dot = (ImageView) dotsLayout.getChildAt(i);if (i == position) {dot.setImageResource(R.drawable.dot_active);} else {dot.setImageResource(R.drawable.dot_inactive);}}}/*** 自动播放轮播图*/private void startAutoPlay() {final Handler handler = new Handler(Looper.getMainLooper());final Runnable Update = new Runnable() {public void run() {if (currentPage == DOT_COUNT) {currentPage = 0;}viewPager.setCurrentItem(currentPage++, true);}};timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {handler.post(Update);}}, DELAY_MS, PERIOD_MS);}/*** 销毁定时器*/@Overridepublic void onDestroy() {super.onDestroy();if (timer != null) {timer.cancel();timer = null;}}

http://www.xdnf.cn/news/12312.html

相关文章:

  • Vue---vue使用AOS(滚动动画)库
  • 深度学习习题2
  • c++ 基于OpenSSL的EVP接口进行SHA3-512和SM3哈希计算
  • 广州邮科:引领嵌入式通信电源系统创新与发展
  • CMake指令:add_definitions
  • Profinet转CAN网关与西门子PLC的互联互通基础操作流程
  • 二叉树的遍历总结
  • 统信桌面专业版如何使用python开发平台jupyter
  • Kotlin 2.1 一元二次方程(顺序结构版)
  • three.js中使用tween.js的chain实现动画依次执行
  • 第09期_网站搭建_卡密验证 易如意1.71正式版 虚拟主机搭建笔记 软件卡密系统
  • 嵌入式学习 D33:系统编程--网路编程
  • dvwa12——XSS(Stored)
  • 回文数 - 力扣
  • Vue Router的核心实现原理深度解析
  • Python训练营打卡 Day45
  • RAID磁盘阵列
  • 算法:前缀和
  • 动态规划---股票问题
  • Job 运维类
  • JAVA数据库连接
  • Rocketmq消息队列 消息模型 详解
  • [蓝桥杯]全球变暖
  • Filebeat收集nginx日志到elasticsearch,最终在kibana做展示(二)
  • Next-AI聊天应用-复用chat组件
  • 数据炼金术:电商突围的智能决策革命
  • [闭源saas选项]Pinecone:为向量数据库而生的实时语义搜索引擎
  • OMS主动运维服务:赋能中小企业运维价值升级
  • Java类加载过程
  • 使用子树合并策略更新git项目的部分目录