ViewPager 使用

使用ViewPager实现功能:
     1. ViewPager 使用设置适配器
     2. ViewPager 添加addOnPageChangeListener 监听
     3. ViewPager 实现伪 无限循环
         public int getCount() {
            return  Integer.MAX_VALUE;
            }
            // 获取获取对应数据 position
     imageView.setImageResource(imgList.get(position%imgList.size()));
     4.  设置支持向右边滑动, 设置第一页为中间其实也即可
     5.  延时切换,handler 设置制动轮播
     6. 实现手指按下 停止 自动轮播
     
*******************核心代码区*********************************************************************

package lanya.denganzhi.com.viewpagerdemo;
public class MainActivity extends AppCompatActivity {

 ViewPager viewPager;
 List<Integer> imgList;
    private LinearLayout dot_layout;
    private TextView tv_intro;
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case  MSGWHAT:
            viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
                    handler.sendEmptyMessageDelayed(MSGWHAT,4000);
                    break;
            }
        }
    };
    public final  int MSGWHAT=1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager)findViewById(R.id.viewPager);
        tv_intro = (TextView) findViewById(R.id.tv_intro);
        imgList=new ArrayList<>();
        imgList.add(R.mipmap.a);
        imgList.add(R.mipmap.b);
        imgList.add(R.mipmap.c);
        dot_layout = (LinearLayout) findViewById(R.id.dot_layout);
        initDots();
//     1. ViewPager 使用设置适配器
        viewPager.setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                //  3. ViewPager 实现伪 无限循环, 返回页数
              //  return imgList.size();
                return  Integer.MAX_VALUE;
            }

            // 相当于 ListView的 getView 方法
            @Override
            public Object instantiateItem(ViewGroup container, final  int position) {

                View view= View.inflate(MainActivity.this,R.layout.adapter_ad,null);
                ImageView imageView= view.findViewById(R.id.image1);
                imageView.setImageResource(imgList.get(position%imgList.size()));
                imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.e("denganzhi","点击了item:"+imgList.get(position%imgList.size()));
                    }
                });
//    6. 实现手指按下Pager 停止 自动轮播
                imageView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        switch (event.getAction()) {

                            case MotionEvent.ACTION_DOWN:
                                Log.e("denganzhi","手指按下");
                          handler.removeMessages(MSGWHAT);
                                break;
                            case MotionEvent.ACTION_UP:
                                Log.e("denganzhi","按下离开");
                                handler.sendEmptyMessageDelayed(MSGWHAT,4000);
                                break;

                        }
                        return false;
                    }
                });

                container.addView(view);//一定不能少,将view加入到viewPager中
                return view;
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                /**
                 *  ViewPager预加载默认缓存3页 ,当前显示页,上一页,下一页,显示2个时候,3已经被创建了
                 *  加载第4页的时候,第0页被销毁
                 *  true 创建使用缓冲
                 *  false 重新创建
                 *  google 官方推荐这么写的
                 */
                return view==object;
            }
         // object 当前被销毁的pager对象
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView((View) object);
            }
        });


    //    viewPager.setCurrentItem(400);  // 设置默认显示400页
        // 4.设置支持向右边滑动, 设置第一页为中间其实也即可

        // 如何理解
        // 比如 100/50  50%3= 2   50-2=48  从48开始循环
        int centerPager= Integer.MAX_VALUE/2;
        int value = centerPager% imgList.size();
        viewPager.setCurrentItem(centerPager-value);
   // 5.  延时切换
        handler.sendEmptyMessageDelayed(MSGWHAT,4000);

        //    2. ViewPager 添加addOnPageChangeListener 监听
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                updateIntroAndDot();
            }

            @Override
            public void onPageSelected(int position) {
             // 当pager选中的时候
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    private void initDots(){
        for (int i = 0; i < imgList.size(); i++) {
            View view = new View(this);
            LayoutParams params = new LayoutParams(8, 8);
            if(i!=0){
                params.leftMargin = 5;
            }
            view.setLayoutParams(params);
            view.setBackgroundResource(R.drawable.selector_dot);
            dot_layout.addView(view);
        }
    }
    /**
     * 更新文本
     */
    private void updateIntroAndDot(){
        // 设置可以轮训滚动,比如getCount 设置1000
        int currentPage = viewPager.getCurrentItem()%imgList.size();
        tv_intro.setText(imgList.get(currentPage)+"");

        for (int i = 0; i < dot_layout.getChildCount(); i++) {

            // 设置state_enabled = false ,那么 这个点走dot_unfocus.xml drawable
            dot_layout.getChildAt(i).setEnabled(i==currentPage);
        }
    }
@Override
protected void onDestroy() {
    handler.removeMessages(MSGWHAT);
    super.onDestroy();
}

}
 

*******************核心代码区********************************************************************* 

效果上图:

发布了90 篇原创文章 · 获赞 90 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/104880987