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:

ViewPager使用讲解

代码:

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);
            //ViewPageritem增加点击事件(一般会给图片设置点击事件)
            ivIcon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContent, "跳转到美图展示界面", Toast.LENGTH_SHORT).show();
                }
            });
            ivIcon.setImageResource(mImageIds[i]);
            /**
             * setImageResourcesetBackGroundResource区别:
             * 后者是可以填充父布局的
             */
            //将布局对象添加给容器
            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>