zoukankan      html  css  js  c++  java
  • Android ViewPager轮播图

      Android客户端开发中很多时候需要用到轮播图的方式进行重点新闻的推送或者欢迎页面的制作,下面这个轮播图效果的Deamo来自互联网再经过修改而成。

      1、布局文件activity_main.xml中添加如下内容

    <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="wrap_content"
            android:layout_height="200dip" />
    
        <LinearLayout
            android:layout_alignBottom="@id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#33000000"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/image_desc"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/app_name"
                android:textColor="@android:color/white"
                android:textSize="18sp" />
    
            <LinearLayout
                android:id="@+id/point_group"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:orientation="horizontal"
                >
            </LinearLayout>
        </LinearLayout>

      2、java代码

      添加属性

        private ViewPager viewPager;
        private LinearLayout point_group;
        private TextView image_desc;
        // 图片资源id
        private final int[] images = {R.drawable.a, R.drawable.b, R.drawable.c,
                R.drawable.d, R.drawable.e};
        // 图片标题集合
        private final String[] imageDescriptions = {"第一张图片",
                "第二张图片", "第三张图片", "第四张图片", "第五张图片"};
    
        private ArrayList<ImageView> imageList;
        // 上一个页面的位置
        protected int lastPosition = 0;
    
        // 判断是否自动滚动viewPager
        private boolean isRunning = true;
        private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                // 执行滑动到下一个页面
                viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                if (isRunning) {
                    // 在发一个handler延时
                    handler.sendEmptyMessageDelayed(0, 5000);
                }
            }
        };

      onCreate中添加如下内容

            viewPager = (ViewPager) findViewById(R.id.viewPager);
            point_group = (LinearLayout) findViewById(R.id.point_group);
            image_desc = (TextView) findViewById(R.id.image_desc);
            image_desc.setText(imageDescriptions[0]);
    
            // 初始化图片资源
            imageList = new ArrayList<ImageView>();
            for (int i : images) {
                // 初始化图片资源
                ImageView imageView = new ImageView(this);
                imageView.setBackgroundResource(i);
                imageList.add(imageView);
    
                // 添加指示小点
                ImageView point = new ImageView(this);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100,
                        15);
                params.rightMargin = 20;
                params.bottomMargin = 10;
                point.setLayoutParams(params);
                point.setBackgroundResource(R.drawable.point_bg);
                if (i == R.drawable.a) {
                    //默认聚焦在第一张
                    point.setBackgroundResource(R.drawable.point_bg_focus);
                    point.setEnabled(true);
                } else {
                    point.setEnabled(false);
                }
    
                point_group.addView(point);
            }
    
            viewPager.setAdapter(new MyPageAdapter());
            // 设置当前viewPager的位置
            viewPager.setCurrentItem(Integer.MAX_VALUE / 2
                    - (Integer.MAX_VALUE / 2 % imageList.size()));
            viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
                @Override
                public void onPageSelected(int position) {
                    // 页面切换后调用, position是新的页面位置
    
                    // 实现无限制循环播放
                    position %= imageList.size();
    
                    image_desc.setText(imageDescriptions[position]);
    
                    // 把当前点设置为true,将上一个点设为false;并设置point_group图标
                    point_group.getChildAt(position).setEnabled(true);
                    point_group.getChildAt(position).setBackgroundResource(R.drawable.point_bg_focus);//设置聚焦时的图标样式
                    point_group.getChildAt(lastPosition).setEnabled(false);
                    point_group.getChildAt(lastPosition).setBackgroundResource(R.drawable.point_bg);//上一张恢复原有图标
                    lastPosition = position;
    
                }
    
                @Override
                public void onPageScrolled(int position, float positionOffset,
                                           int positionOffsetPixels) {
                    // 页面正在滑动时间回调
    
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
                    // 当pageView 状态发生改变的时候,回调
    
                }
            });
    
            /**
             * 自动循环: 1.定时器:Timer 2.开子线程:while true循环 3.ClockManger
             * 4.用Handler发送延时信息,实现循环,最简单最方便
             *
             */
    
            handler.sendEmptyMessageDelayed(0, 3000);

      实现onDestroy方法

        @Override
        protected void onDestroy() {
    // 停止滚动
            isRunning = false;
            super.onDestroy();
        }

      定义PagerAdapter子类

        private class MyPageAdapter extends PagerAdapter {
            // 需要实现以下四个方法
    
            @Override
            public int getCount() {
                // 获得页面的总数
                return Integer.MAX_VALUE;
            }
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                // 判断view和Object对应是否有关联关系
                if (view == object) {
                    return true;
                } else {
                    return false;
                }
            }
    
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                // 获得相应位置上的view; container view的容器,其实就是viewpage自身,
                // position: viewpager上的位置
                // 给container添加内容
                container.addView(imageList.get(position % imageList.size()));
    
                return imageList.get(position % imageList.size());
            }
    
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                // 销毁对应位置上的Object
                // super.destroyItem(container, position, object);
                container.removeView((View) object);
                object = null;
            }
    
        }

      最后编译运行即可,代码分享在这:http://files.cnblogs.com/files/rwxwsblog/ViewPagerDeamo.zip

  • 相关阅读:
    Luogu P1020 导弹拦截
    MySQL事务隔离级别和实现原理
    classloader加载class文件的原理和机制
    Spring Bean的生命周期只有这四个阶段
    Spring 源码:BeanFactory 简介以及它 和FactoryBean的区别
    开闭原则——面向对象设计原则
    HashSet的实现原理
    装饰器模式(装饰设计模式)详解
    在java中,HashMap 或者HashTable,它们的键值被放满了,会出现什么情况?
    Mybitis 批量插入实践
  • 原文地址:https://www.cnblogs.com/rwxwsblog/p/4913737.html
Copyright © 2011-2022 走看看