利用ViewPager实现轮播图

来源:互联网 发布:索尼z3v电信4g网络 编辑:程序博客网 时间:2024/05/29 02:56

轮播图的实现网上有很多资源,写这篇文章只是回顾所学的知识。对ViewPager的一些处理,比如适配器各个方法的作用等。
布局:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="so.wih.android.lunbotu.MainActivity">    <android.support.v4.view.ViewPager        android:id="@+id/view_pager"        android:layout_width="match_parent"        android:layout_height="200dp"         />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="50dp"        android:layout_alignBottom="@id/view_pager"        android:background="#aa000000"        android:gravity="center"        android:orientation="vertical">        <TextView            android:id="@+id/tv_desc"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:maxLines="1"            android:textColor="#FFFFFF"            android:textSize="16sp"            android:text="图片下的描述文字"/>        <LinearLayout            android:id="@+id/ll_point"            android:paddingTop="10dp"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal">            <!--这是指示点的位置-->        </LinearLayout>    </LinearLayout></RelativeLayout>

选择器:selector_point.xml

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_enabled="true" android:drawable="@drawable/point_select"></item>    <item android:drawable="@drawable/point_nomal"></item></selector>

point_nomal.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="oval">    <size android:height="5dp" android:width="5dp"></size>    <solid android:color="#ccc"></solid></shape>

point_select.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="oval">    <size android:width="5dp" android:height="5dp" ></size>    <solid android:color="#F00"></solid></shape>

代码(包含详细注释):

import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    /**     * 图片资源id     */    private final int[] imageIds = {R.mipmap.a,R.mipmap.b,R.mipmap.c,R.mipmap.d,R.mipmap.e};    /**     * 图片下的描述     */    private final String[] desc = {"巩俐不低俗,我就不能低俗","扑树又回来啦!再唱经典老歌引万人大合唱"    ,"揭秘北京电影如何升级","乐视网TV版大派送","热血屌丝的反杀"};    public List<ImageView> imageList = new ArrayList<>();    private ViewPager viewPager;    private TextView tv_desc;    private android.content.Context mContext;    private LinearLayout ll_point;    private ImageView iv_test;    /**     * 是否在运行程序     */    private boolean isRunning = false;    //利用handler实现轮播    private Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            //检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。            if (handler.hasMessages(101)){                handler.removeMessages(101);            }            if(isRunning){                viewPager.setCurrentItem(viewPager.getCurrentItem()+1);                //形成循环2s发送消息,轮播                sendEmptyMessageDelayed(101,2000);            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mContext=this ;        setContentView(R.layout.activity_main);        viewPager = (ViewPager) findViewById(R.id.view_pager);        tv_desc = (TextView) findViewById(R.id.tv_desc);        ll_point = (LinearLayout) findViewById(R.id.ll_point);        //数据        for (int i=0;i<imageIds.length;i++){            //设置图片            ImageView iv_pic = new ImageView(mContext);            iv_pic.setBackgroundResource(imageIds[i]);            imageList.add(iv_pic);            //动态生成指示点            ImageView iv_point = new ImageView(mContext);            iv_point.setBackgroundResource(R.drawable.selector_point);            //生成布局参数            LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(                    LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT            );            //设置布局参数的margin值            param.leftMargin = 5 ;            //添加view时,传入布局参数            ll_point.addView(iv_point , param);            //处理初始时指示点的问题            if(i==0){                iv_point.setEnabled(true);            }else{                iv_point.setEnabled(false);            }        }        viewPager.setAdapter(new MyPagerAdapter());        /*        Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % imageList.size()这个式子的结果是imageList.size()        的整数倍,即总是定位到下标为0的图片        */        viewPager.setCurrentItem(Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % imageList.size());        //初始时处理图片下的描述文字问题        tv_desc.setText(desc[0]);        isRunning = true ;        handler.sendEmptyMessageDelayed(101,2000); //2s后发送消息        initListener();    }    private class MyPagerAdapter extends PagerAdapter {        /**         * 获取所有Pager的总数         * @return         */        @Override        public int getCount() {            return Integer.MAX_VALUE;        }        /**         * 判断view是否和object一致         * @param view         * @param object         * @return         */        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        //还有两个方法,必须重写        /**         * 初始化页面         * @param container 容器         * @param position 范围0-2的32次方         * @return 返回值是一个View         */        @Override        public Object instantiateItem(ViewGroup container, int position) {            //修改position的范围为0-(imageList.size()-1)            int _position = position % imageList.size();            ImageView iv_po = imageList.get(_position);            container.addView(iv_po);            return iv_po;        }        /**         * 销毁页面         * @param container         * @param position         * @param object         */        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            //super.destroyItem(container, position, object);必须删掉此句,他在源码中直接抛出异常            container.removeView((View) object);        }    }    private void initListener() {        //添加页面改变监听        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            int lastPosition = 0 ;            //当pager滑动的时候调用            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            }            //当页面被选中的时候调用            @Override            public void onPageSelected(int position) {                int _position = position % imageList.size();                tv_desc.setText(desc[_position]);                //设置上一个点不可用                ll_point.getChildAt(lastPosition).setEnabled(false);                //下一个点可用                ll_point.getChildAt(_position).setEnabled(true);                lastPosition = _position ;            }            //当pager滑动改变的时候调用            @Override            public void onPageScrollStateChanged(int state) {            }        });    }    //在退出时终止handler    @Override    protected void onDestroy() {        super.onDestroy();        isRunning = false ;    }}
0 0
原创粉丝点击