android中ViewPager的用法以及自动滚动播放实现初探

本文的目标是学会ViewPager的用法,顺便试着实现自动滚动播放的功能。

1 ViewPager的基本使用

ViewPager是android系统提供的一个组件,它是一个可以让用户左右滑动View的容器。下面介绍ViewPager的使用方法。

1.1添加布局
如下代码表示在布局中加入ViewPager组件。
    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    </android.support.v4.view.ViewPager>
1.2 初始化View列表
这里只是简单的添加6个ImageView。
    private void initView() {
        iView0 = new ImageView(getApplicationContext());
        iView0.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
        iView0.setImageResource(Color.BLACK);

        iView1 = new ImageView(getApplicationContext());
        iView1.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
        iView1.setImageResource(R.drawable.viewpager);

        iView2 = new ImageView(getApplicationContext());
        iView2.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
        iView2.setBackgroundColor(Color.WHITE);
        iView3 = new ImageView(getApplicationContext());
        iView3.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
        iView3.setBackgroundColor(Color.GREEN);

        iView4 = new ImageView(getApplicationContext());
        iView4.setLayoutParams(new RelativeLayout.LayoutParams(400, 100));
        iView4.setBackgroundColor(Color.BLUE);

    }
1.3初始化Adapter
设置Adapter。
private class MyAdapter extends PagerAdapter {

        public MyAdapter() {
            Log.d("123", "init adapter");
            imList.add(iView0);
            imList.add(iView1);
            imList.add(iView2);
            imList.add(iView3);
            imList.add(iView4);
        }

        @Override
        public int getCount() {
            // 有多少个View
            Log.d("123", imList.size() + "mlist count");
            return imList.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // 这个就是这么写的,目前不知道为什么
            Log.d("123", "isViewFromObject");
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // 销毁某个View,ViewPager会保存若干个View,其余的都会销毁。
            container.removeView(imList.get(position));
            Log.d("123", "destroyItem" + "" + "continer count is" + container.getChildCount());
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // 创建一个新的View,并添加到View列表中。
            Log.d("123", position + "" + "continer count is" + container.getChildCount());
            container.addView(imList.get(position), 0);
            return imList.get(position);
        }

    }
1.4在UI主线程中设置并初始化ViewPager
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        initView();
        ((ViewPager) findViewById(R.id.viewPager)).setAdapter(new MyAdapter());
    }
通过以上步骤完成了对ViewPager的使用。
2.关于自动滚动播放的实现。

目前已经实现了功能,但是还有一点瑕疵,先放出来吧,以后再检查下到底是什么原因。

2.1实现思路

在每次ViewPager翻页之后延时5S发送一个滚动消息,消息包含将要翻页的页数。并且在翻页的时候,清除所有已经存在的延时翻页请求。
要使用到包括Handler类和ViewPager的OnPageChangeListener类。Handler负责子线程与主线程进行通信。OnPageChangeListener类负责更新ViewPager显示的View。
首先,创建Handler类的handleMessage方法对子线程发送的更新UI消息进行处理,当接受到消息之后就对ViewPager进行更新。
其次,在ViewPager的OnPageChangeListener类中PageSelected方法中通过Handler.postDelayed方法,通过延时发送消息的方法实现自动更新显示的View.

2.2实现代码
2.2.1OnCreate方法
在OnCreate方法中增加如下代码:
        ((ViewPager) findViewById(R.id.viewPager)).addOnPageChangeListener(this);
        handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                // 延时翻页消息的处理
                if (msg.what == 1) {
                    Log.d("123", "handle message nowPage is"+nowPage+"imList count is"+imList.size());
                    if(msg.arg1==-1){
                        ((ViewPager) findViewById(R.id.viewPager)).setCurrentItem(0);
                        return true;
                    }
                    ((ViewPager) findViewById(R.id.viewPager)).setCurrentItem(msg.arg1);
                }
                return true;
            }
        });
        ((ViewPager) findViewById(R.id.viewPager)).setCurrentItem(0);//初始化界面
2.2.2改写OnPageChangeListener中的onPageSelected方法
        @Override
    public void onPageSelected(int arg0) {
        // 翻页之后发送延时翻页消息
        handler.removeMessages(1);
        Log.d("123", arg0 + "" + "onPageSelected position is" + arg0);
            if (arg0 == imList.size() -1) {
                nextPage = 0;
            }
            else{
            nextPage=arg0+1;//下一页
            }
            handler.postDelayed(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    Message msg=new Message();
                    msg.what=1;
                    msg.arg1=nextPage;
                    handler.sendMessage(msg);
                }
            }, 5000);

    }

以上便实现了所有的功能,但是在实际的程序中还是有点问题,比如没有处理用户的交互事件,用户长按图片没有处理,留待以后要再看吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值