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使用讲解相关推荐

  1. Android之ViewPager讲解

    ViewPager的功能提供界面切换的效果,我们可以定义一组VIEW,在当前界面中进行左右切换它们. 使用ViewPager时我们需要以下准备: 1.准备适配器: <span style=&qu ...

  2. android ViewPager滑动事件讲解

    首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChan ...

  3. ViewPager,TabLayout,Fragment实现tabs滑动

    工作半年了,准备在新的一年开始写点博客,记录自己的成长,如果能给别人一些参考就更好了. Demo实现: 前段时间公司的项目遇到了使用 ViewPager,TabLayout 和 Fragment实现一 ...

  4. Android中Fragment+ViewPager的配合使用

    原本在上一篇博客中要讲解一个Fragment的综合应用,但是中间又想到了滑屏方式,所以就分类在总结了一下,(http://smallwoniu.blog.51cto.com/3911954/13089 ...

  5. ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同

     相关文章: 1.<ViewPager 详解(一)---基本入门> 2.<ViewPager 详解(二)---详解四大函数> 3.<ViewPager 详解(三)-- ...

  6. 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8980917 本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个 ...

  7. 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8980917 做Android开发加起来差不多也有一年多的时间了,总是想写点自 ...

  8. android view 源码分析,Android ViewPager源码详细分析

    1.问题 由于Android Framework源码很庞大,所以读源码必须带着问题来读!没有问题,创造问题再来读!否则很容易迷失在无数的方法与属性之中,最后无功而返. 那么,关于ViewPager有什 ...

  9. 引导界面(二)使用ViewPager实现欢迎引导页面

    本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载 ...

最新文章

  1. ICCV 2021 | 简而优:用分类器变换器进行小样本语义分割
  2. 怎么查看linux文件夹下有多少个文件(mac同样)
  3. 用python写一个简单的推荐系统 1
  4. SQL View 的使用语法与原则
  5. 如何使用Google Authenticator在ASP.NET Core中设置两因素身份验证
  6. php检测字符长度(中文)
  7. nodejs怎么与c语言通信费是什么,NodeJS介绍与使用
  8. Qt编程之QtScript
  9. android APK加密、签名
  10. 飞克速读软件的训练法
  11. 如何用adb命令启动安装的APK
  12. 光谱分析中的变量选择
  13. 少儿编程---小猫追气球
  14. 51JOB:根据HR处理简历的一般流程,简历投递后会有如下几种状态出现
  15. 快速学习JS的思考方法、有用
  16. java long 运算_Java Long类型,阶乘计算
  17. CISCN2022东北赛区复赛Writeup-MapleLeaves
  18. Comarin香豆素标记金纳米团簇|Ce6二氢卟吩标记金纳米团簇|红色荧光的水溶性金纳米团簇(T-Au NCs)
  19. 设计模式经典32式(Patterns in Java)(前言)
  20. kettle基本工具的使用

热门文章

  1. (转)关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。...
  2. [Java反射基础四]通过反射了解集合泛型的本质
  3. atime、mtime、ctime
  4. 扫描识别工具Dynamic Web TWAIN使用教程:单独添加/删除对象
  5. 决胜圣诞,女神心情不用猜!
  6. DataGridView绑定list的注意事项
  7. django admin 登陆快速添加验证码功能
  8. 错误代码1833 Cannot change column used in a foreign
  9. 《人工智能:计算Agent基础》——3.3 图搜索
  10. android打包方法超过65k错误