利用ViewPager实现的Android轮播|定时器的使用

一、MainActivity

第一种:MainActivity.class

public class MainActivity extends AppCompatActivity {
    ViewPager viewPager;
    LinearLayout linearLayout;
    List<ImageView> imageViewList=new ArrayList<ImageView>();
    int currentItem=300;//当前item位置
    Timer mTimer;
    int[] resId={R.drawable.xiaoer,R.drawable.guangbo,R.drawable.qinqin,R.drawable.suanzhang};
    Handler myHandler=new Handler();
    /**
     * 定时任务,即在子线程中myHandler发送消息队列,在发送到主线程运行runnable
     */
    TimerTask timerTask=new TimerTask(){
        @Override
        public void run() {
            myHandler.post(runnable);
        }
    };
    private void start() {
        if (mTimer==null){
            mTimer=new Timer();
        }
        mTimer.schedule(timerTask,3000,3000);
    }
    /**
     * 更新UI操作
     */
    Runnable runnable=new Runnable() {
        @Override
        public void run() {
            currentItem++;
            int index=currentItem%4;
            updatePoint(index);
            viewPager.setCurrentItem(currentItem);
        }
    };
    /**
     * 初始化小圆点(如果不需要小圆点则不加)
     */
    private void initPoint(int i) {
        ImageView point=new ImageView(this);
        LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(50,50);
        point.setLayoutParams(params);
        if (i==0){
            point.setImageResource(R.drawable.point_checked);
        }else {
            point.setImageResource(R.drawable.point_normal);
        }
        linearLayout.addView(point);
    }
    /**
     * 更新小圆点(如果不需要小圆点则不加)
     * @param index
     */
    private void updatePoint(int index) {
        for (int i=0;i<imageViewList.size();i++){
            ImageView image= (ImageView) linearLayout.getChildAt(i);
            if (i==index){
                image.setImageResource(R.drawable.point_checked);
            }else {
                image.setImageResource(R.drawable.point_normal);
            }
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager=(ViewPager)findViewById(R.id.viewpager);
        linearLayout=(LinearLayout)findViewById(R.id.point);
        for (int i=0;i<resId.length;i++){
            ImageView imageView=new ImageView(this);
            imageView.setImageResource(resId[i]);
            imageViewList.add(imageView);
            initPoint(i);
        }
        MyAdapter adapter=new MyAdapter();
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(currentItem); //一定要在setAdapter后面
        start();
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            /**
             * 更新当前item数目(currentPosition)转换item时调用此方法
             * @param position
             */
            @Override
            public void onPageSelected(int position) {
                currentItem=position;
                int index=position%imageViewList.size();
                updatePoint(index);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }
    @Override
    protected void onStop() {
        super.onStop();
        if (mTimer!=null){
            mTimer.cancel();
            mTimer=null;
        }
    }
    /**
     * ViewPager适配器
     */
    public class MyAdapter extends PagerAdapter {
        public MyAdapter() {
            super();
        }
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int index=position%imageViewList.size();    //循环imageViewList里面的内容
            ((ViewPager)container).addView(imageViewList.get(index));
            return imageViewList.get(index);
        }
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager)container).removeView(imageViewList.get(position%imageViewList.size()));
        }
        /**
         *设定tab数目为Integer.MAX_VALUE
         * @return
         */
        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==object;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        myHandler.removeCallbacks(runnable);
    }
}


第二种:MainActivity.class

public class MainActivity extends AppCompatActivity {
    ViewPager viewPager;
    LinearLayout linearLayout;
    List<ImageView> imageViewList = new ArrayList<ImageView>();
    int currentItem = 300;
    long lastTime;
    int[] resId = {R.drawable.xiaoer, R.drawable.guangbo, R.drawable.qinqin, R.drawable.suanzhang};
    Handler myHandler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            /**
             * 在主线程中运行
             */
            if (System.currentTimeMillis() - lastTime > 3000) {
                currentItem++;           //自动切换时item的位置逐渐+1
                viewPager.setCurrentItem(currentItem);
                int index = currentItem % imageViewList.size();
                updatePoint(index);
            }
            lastTime = System.currentTimeMillis(); //重新设定时间
            myHandler.postDelayed(runnable,3000); //3秒后重新运行此runnable
             }
    };
    /**
     * 初始化小圆点(如果不需要小圆点则不加)
     */
    private void initPoint(int i) {
        ImageView point = new ImageView(MainActivity.this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(50, 50);
        point.setLayoutParams(params);
        if (i == 0) {
            point.setImageResource(R.drawable.point_checked);
        } else {
            point.setImageResource(R.drawable.point_normal);
        }
        linearLayout.addView(point);
    }

    /**
     * 更新小圆点(如果不需要小圆点则不加)
     * @param index
     */
    private void updatePoint(int index) {
        for (int i = 0; i < imageViewList.size(); i++) {
            ImageView image = (ImageView) linearLayout.getChildAt(i);
            if (i == index) {
                image.setImageResource(R.drawable.point_checked);
            } else {
                image.setImageResource(R.drawable.point_normal);
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        linearLayout = (LinearLayout) findViewById(R.id.point);
        for (int i = 0; i < resId.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(resId[i]);
            imageViewList.add(imageView);
            initPoint(i);
        }

        MyAdapter adapter = new MyAdapter();

        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(currentItem); //一定要在setAdapter后面
        myHandler.postDelayed(runnable, 3000); //3秒后运行切换动画(运行runnable)
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                currentItem = position; //手动切换时设定当前的item位置
                int index = position % imageViewList.size();
                updatePoint(index);
                lastTime = System.currentTimeMillis();//手动切换时重新设定时间
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });}

        /**
         * ViewPager适配器
         */
        public class MyAdapter extends PagerAdapter {
            public MyAdapter() {
                super();
            }
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                int index = position % imageViewList.size(); //循环imageViewList里面的内容
                ((ViewPager) container).addView(imageViewList.get(index));
                return imageViewList.get(index);
            }
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                ((ViewPager) container).removeView(imageViewList.get(position % imageViewList.size()));
            }
            /**
             * 设定tab数目为Integer.MAX_VALUE
             */
            @Override
            public int getCount() {
                return Integer.MAX_VALUE;
            }
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
        }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        myHandler.removeCallbacks(runnable);//回收mHandler
    }
}

二、activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_centerInParent="true"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <LinearLayout
            android:id="@+id/point"
            android:layout_alignParentBottom="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
        </LinearLayout>
    </RelativeLayout>

</LinearLayout>

三、圆点指示器

1、point_checked.xml

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

2、point_normal.xml

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


以上只是定时器的区别


定时器的用法

一、Timer

这个类功能也是用于计时的,而且是线程安全的,创建这个类的对象也很简单,直接Timer mTimer=new Timer();new出来,也没什么可说的,而且这个对象的主要方法就一个就是schedule(),意思就是计时计划,计时安排。我就主要讲其中两个方法吧:

mTimer.schedule(task, when);这个方法第一个参数就是需要传入一个TimerTask对象,该对象实现了Runnable接口,简单的说就是一个线程对象,就是开一个线程来执行run()方法中的代码的。第二个参数传入的类型是Date类型,意思就是定时一样,这个run()方法中的代码在什么时候执行。
mTimer.schedule(task, delay);这个方法的第一个参数和上面的一样。第二个参数就是一个long类型的数据,意思就是延迟多少时间执行run()方法中的代码,单位为毫秒。

我就讲直接上代码看看怎么用吧:

[java]  view plain  copy
 print ?
  1. Timer mTimer = new Timer();  
  2. TimerTask mTimerTask = new TimerTask() {//创建一个线程来执行run方法中的代码  
  3.     @Override  
  4.     public void run() {  
  5.     //要执行的代码  
  6.     }  
  7. };  
  8. mTimer.schedule(mTimerTask, 3000);//延迟3秒执行  

【注意】在该计时器中创建的线程不是主线程,而是创建了一个子线程,因为子线程中不能直接更新UI,故在run方法中不能执行有关更新主界面UI的代码,如果要更新UI,那必须用消息处理器Handler来处理,在run中发送一个消息给消息队列,例如:

Timer mTimer = new Timer();
    TimerTask mTimerTask = new TimerTask() {//创建一个线程来执行run方法中的代码
        @Override
        public void run() {
            //要执行的代码
            myHandler.post(new Runnable() {
                @Override
                public void run() {
                    //更新UI操作
                }
            });
        }
    };
mTimer.schedule(mTimerTask, 3000);//延迟3秒执行



如果我们想既要达到计时的功能,又可以在执行的代码中直接更新主界面UI,那有没有一个好办法呢?答案是有的,就是第三点

二、new Handler().postDelayed()

该方法就是利用我们常说的消息处理器。该方法原理就是在主线程中创建一个Handler消息处理器,然后利用其中的一个postDelayed(Runnable r, long delayMillis)方法,该方法第一个参数需要传入一个Runnable接口,并实现run()方法,第二个参数就是延迟多少时间将run()方法中的代码通过一个消息发送给消息队列,然后在主线程中执行这个消息中的代码,即是run方法中的代码,从而实现在主线程中更新界面UI。

贴代码吧:

[java]  view plain  copy
 print ?
  1. new Handler().postDelayed(new Runnable() {//在当前线程(也即主线程中)开启一个消息处理器,并在3秒后在主线程中执行,从而来更新UI  
  2.     @Override  
  3.     public void run() {  
  4.         //有关更新UI的代码  
  5.     }  
  6. }, 3000);//3秒后发送          




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值