ViewPager使用讲解
ViewPager的使用讲解
ViewPager的几个主要逻辑:
一、自动轮播逻辑:
1.使用Handler发送一个延时消息来启动自动轮播
2.在handleMessage方法中,先获取当前页面,然后将当前页面在使用之前设置为下一页(可以切换到下一页)
3.在在handleMessage方法中,
继续发送一个延时消息,这样就可以不断的轮播了
二、手指按下的时候停止轮播,抬起继续轮播逻辑:
1.给ViewPager设置onTouchEventListener事件在手指按下的时候,使用Handler将所有消息移除
2.手指抬起的时候,继续发送延时消息
三、动态更新小圆点逻辑:
1.创建一个存放小圆点的LinearLayout布局
2.在drawable目录下创建shape标签的文件,使用它的shape属性中的oval绘制圆,并用size标签定相同的宽和高
3.创建ImageVeiw对象,并通过setImageResource将drawable设置给ImageVeiw对象
4.将ImageVeiw添加到LinearLayout容器中
5.通过修改布局参数的leftMargin属性,修改小圆点的间距
6.通过ViewPager的addOnPageChangeListener方法监听页面的切换,然后在页面选中的时候更新小红点的状态
展示一个下App:
代码:
public class MainActivity extends AppCompatActivity {private ViewPager mViewpager;private int[] mImageIds = {R.mipmap.a, R.mipmap.b, R.mipmap.c,R.mipmap.d, R.mipmap.e, R.mipmap.f, R.mipmap.g};private String[] mImageDes = {"美图一", "美图二", "美图三","美图四", "美图五", "美图六", "美图七"};private MainActivity mContent;private TextView tvTitle;private LinearLayout mLlContainer; //小圆点的容器 private Handler mHandler = new Handler() {@Override public void handleMessage(Message msg) {switch (msg.what) {case 0://切换到下一页 int currentItem = mViewpager.getCurrentItem();mViewpager.setCurrentItem(++currentItem);mHandler.sendEmptyMessageDelayed(0, 2000); //继续两秒发一个消息 break;}}};@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContent = MainActivity.this;mViewpager = (ViewPager) findViewById(R.id.viewpager);mLlContainer = (LinearLayout) findViewById(R.id.llContainer);tvTitle = (TextView) findViewById(R.id.tvTitle);//初始化第一个条目文字 tvTitle.setText(mImageDes[0]);mViewpager.setAdapter(new MyViewPager());//设置当期的item位置 mViewpager.setCurrentItem(mImageIds.length * 1000000);initDot(); //初始化小圆点 //监听ViewPager页面切换 mViewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {//页面滑动的时候回调 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}//页面被选中的时候回调 @Override public void onPageSelected(int position) {position = position % mImageDes.length;tvTitle.setText(mImageDes[position]);for (int i = 0; i < mLlContainer.getChildCount(); i++) {ImageView ivDot = (ImageView) mLlContainer.getChildAt(i);if (i == position) {ivDot.setImageResource(R.drawable.red_dot_shape);} else {ivDot.setImageResource(R.drawable.grey_dot_shape);}}}//页面滑动状态发生改变的时候回调 @Override public void onPageScrollStateChanged(int state) {}});//给ViewPager设置触摸监听 mViewpager.setOnTouchListener(new View.OnTouchListener() {@Override public boolean onTouch(View v, MotionEvent event) {int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN://手按下的时候停止自动轮播 mHandler.removeCallbacksAndMessages(null);break;case MotionEvent.ACTION_UP://抬起的时候继续自动轮播 mHandler.sendEmptyMessageDelayed(0, 2000);break;}return false;}});}private void initDot() {for (int i = 0; i < mImageIds.length; i++) {ImageView ivDot = new ImageView(this);//布局参数可以修改xml文件中以layout开头的属性, // LayoutParams保存了一个View的布局参数。 /** * 注意:通过getLayoutParams()获取LayoutParams时, * 需要根据View所在父布局的类型来设置不同的类型, * (为什么呢?我们知道LayoutParams作用就是子视图告诉父视图 * 它们想要变成什么样的布局,因此必须要使用父控件.LayoutParams, * 况且只有ViewGroup才有LayoutParams属性) */ LinearLayout.LayoutParams layoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);if (i > 0) {layoutParams.leftMargin = 10;ivDot.setImageResource(R.drawable.grey_dot_shape);} else {ivDot.setImageResource(R.drawable.red_dot_shape);}ivDot.setLayoutParams(layoutParams);mLlContainer.addView(ivDot);}//启动自动轮播 mHandler.sendEmptyMessageDelayed(0, 2000); //延时两秒发一个消息 }/** * ViewPager内存优化: * 永远最多只加载3页,其余页都销毁 * 即:上一页、当前页、下一页 * 这样的做法也有助于滑动的流畅性 */ class MyViewPager extends PagerAdapter {//返回条目的个数 @Override public int getCount() {//为了可以无限制的左右滑动,将此值设为整数的最大值 return Integer.MAX_VALUE;}//判断当前显示的对象是否是我们初始化返回的object(固定这样写) @Override public boolean isViewFromObject(View view, Object object) {return view == object;}//初始化条目的布局,类似于getView(); @Override public Object instantiateItem(ViewGroup container, final int position) {int i = position % mImageIds.length;//初始化布局对象 View view = View.inflate(mContent, R.layout.viewpager_item, null);ImageView ivIcon = (ImageView) view.findViewById(R.id.ivIcon);//给ViewPager的item增加点击事件(一般会给图片设置点击事件) ivIcon.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {Toast.makeText(mContent, "跳转到美图展示界面", Toast.LENGTH_SHORT).show();}});ivIcon.setImageResource(mImageIds[i]);/** * setImageResource和setBackGroundResource区别: * 后者是可以填充父布局的 */ //将布局对象添加给容器 container.addView(view);//返回布局对象 return view;}//销毁布局,由系统自动调用(固定这样写) @Override public void destroyItem(ViewGroup container, int position, Object object) {//上面我们将布局放入到container容器中,现在移除 container.removeView((View) object);}} }
布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:layout_width="match_parent" android:layout_height="200dp"> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="#277bdb" android:gravity="center" android:orientation="vertical" android:padding="8dp"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="标题" android:textColor="#000" android:textSize="16sp"/> <LinearLayout android:id="@+id/llContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal"/> </LinearLayout> </FrameLayout> </RelativeLayout>
shape标签:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#ccc"/> <size android:width="10dp" android:height="10dp"/> </shape>
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#f00"/> <size android:width="10dp" android:height="10dp"/> </shape>
ViewPager使用讲解相关推荐
- Android之ViewPager讲解
ViewPager的功能提供界面切换的效果,我们可以定义一组VIEW,在当前界面中进行左右切换它们. 使用ViewPager时我们需要以下准备: 1.准备适配器: <span style=&qu ...
- android ViewPager滑动事件讲解
首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChan ...
- ViewPager,TabLayout,Fragment实现tabs滑动
工作半年了,准备在新的一年开始写点博客,记录自己的成长,如果能给别人一些参考就更好了. Demo实现: 前段时间公司的项目遇到了使用 ViewPager,TabLayout 和 Fragment实现一 ...
- Android中Fragment+ViewPager的配合使用
原本在上一篇博客中要讲解一个Fragment的综合应用,但是中间又想到了滑屏方式,所以就分类在总结了一下,(http://smallwoniu.blog.51cto.com/3911954/13089 ...
- ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同
相关文章: 1.<ViewPager 详解(一)---基本入门> 2.<ViewPager 详解(二)---详解四大函数> 3.<ViewPager 详解(三)-- ...
- 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8980917 本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个 ...
- 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解
转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8980917 做Android开发加起来差不多也有一年多的时间了,总是想写点自 ...
- android view 源码分析,Android ViewPager源码详细分析
1.问题 由于Android Framework源码很庞大,所以读源码必须带着问题来读!没有问题,创造问题再来读!否则很容易迷失在无数的方法与属性之中,最后无功而返. 那么,关于ViewPager有什 ...
- 引导界面(二)使用ViewPager实现欢迎引导页面
本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载 ...
最新文章
- ICCV 2021 | 简而优:用分类器变换器进行小样本语义分割
- 怎么查看linux文件夹下有多少个文件(mac同样)
- 用python写一个简单的推荐系统 1
- SQL View 的使用语法与原则
- 如何使用Google Authenticator在ASP.NET Core中设置两因素身份验证
- php检测字符长度(中文)
- nodejs怎么与c语言通信费是什么,NodeJS介绍与使用
- Qt编程之QtScript
- android APK加密、签名
- 飞克速读软件的训练法
- 如何用adb命令启动安装的APK
- 光谱分析中的变量选择
- 少儿编程---小猫追气球
- 51JOB:根据HR处理简历的一般流程,简历投递后会有如下几种状态出现
- 快速学习JS的思考方法、有用
- java long 运算_Java Long类型,阶乘计算
- CISCN2022东北赛区复赛Writeup-MapleLeaves
- Comarin香豆素标记金纳米团簇|Ce6二氢卟吩标记金纳米团簇|红色荧光的水溶性金纳米团簇(T-Au NCs)
- 设计模式经典32式(Patterns in Java)(前言)
- kettle基本工具的使用
热门文章
- (转)关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。...
- [Java反射基础四]通过反射了解集合泛型的本质
- atime、mtime、ctime
- 扫描识别工具Dynamic Web TWAIN使用教程:单独添加/删除对象
- 决胜圣诞,女神心情不用猜!
- DataGridView绑定list的注意事项
- django admin 登陆快速添加验证码功能
- 错误代码1833 Cannot change column used in a foreign
- 《人工智能:计算Agent基础》——3.3 图搜索
- android打包方法超过65k错误