ViewPager用法(一)图片+原点+循环播放

一、概述:

ViewPager 是android扩展包v4包中的类,这个类可以实现左右切换当前的view。

下面是API对它的描述:
Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows.
Note this class is currently under early design and development. The API will likely change in later updates of the compatibility library, requiring changes to the source code of apps when they are compiled against the newer version.
ViewPager is most often used in conjunction with Fragment, which is a convenient way to supply and manage the lifecycle of each page. There are standard adapters implemented for using fragments with the ViewPager, which cover the most common use cases. These are FragmentPagerAdapter andFragmentStatePagerAdapter; each of these classes have simple code showing how to build a full user interface with them.

由文档得知:

  • 1)ViewPager类直接继承了ViewGroup类,显然它也是一个容器控件。
  • 2)类似于ListView的三要素(布局,数据,适配器),ViewPager类也需要一个PagerAdapter适配器类给它提供数据。
  • 3)ViewPager经常和Fragment一起使用。并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
  • 此外,还需要使用两个组件类,分别是PagerTitleStrip类和PagerTabStrip类。PagerTitleStrip类直接继承自ViewGroup类,而PagerTabStrip类继承PagerTitleStrip类,所以这两个类也是容器类。但是有一点需要注意,在定义XML的layout的时候,这两个类必须是ViewPager标签的子标签,不然会出错。

二、PageAdapter 必须重写的四个函数:

  • boolean isViewFromObject(View arg0, Object arg1)
  • int getCount()
  • void destroyItem(ViewGroup container, int position,Object object)
  • Object instantiateItem(ViewGroup container, int position)

三、代码:

此处简单介绍一下上面不带title,下面带点的用法:

xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    tools:context="com.myapplication.viewpagerdemo.MainActivity"
    >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <LinearLayout
        android:id="@+id/linearLayout_points"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:gravity="center"
        android:orientation="horizontal"
        />
</FrameLayout>

MainActivity中代码:

package com.myapplication.viewpagerdemo;

import android.os.Bundle;
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 java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
 * viewPager动态添加圆点,选中该pager时候对应圆点变色
 */
public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    private LinearLayout linearLayout;
    private List<ImageView> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        addPoints();
        setPagerListener();
        autoBanner();
    }

    //自动播放
    private void autoBanner() {
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                if (list.size() > 1) {//多于1个,才循环
                    //子线程不能更新Ui,把主线程请到子线程家里来
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            int index = viewPager.getCurrentItem();
                            index = (index + 1) % list.size();
                            viewPager.setCurrentItem(index, true);
                            //第二个参数布尔值:True to smoothly scroll to the new item, false to transition immediately
                        }
                    });
                }
            }
        };
        //开始一个定时任务,首次执行延迟3000毫秒调用run方法,执行后每2500毫秒执行一次
        timer.schedule(timerTask, 3000, 2500);
    }

    //注册监听,当pager变化,切换圆点颜色
    private void setPagerListener() {
        switchPoint(0);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                switchPoint(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    //遍历圆点,如果id为选中位置就切换颜色
    private void switchPoint(int position) {
        ImageView imageView;
        for (int i = 0; i < linearLayout.getChildCount(); i++) {
            imageView = (ImageView) linearLayout.getChildAt(i);
            if (i == position) {
                imageView.setImageResource(R.drawable.point);
            } else {
                imageView.setImageResource(R.drawable.point_f);
            }
        }

    }

    private void addPoints() {
        for (int i = 0; i < list.size(); i++) {
            ImageView imgPoint = new ImageView(this);
            imgPoint.setImageResource(R.drawable.point_f);
            //设置布局属性
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(5, 0, 0, 0);
            imgPoint.setLayoutParams(lp);
            //将添加的小圆点,加到布局中
            linearLayout.addView(imgPoint);
        }
    }


    private void init() {
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        linearLayout = (LinearLayout) findViewById(R.id.linearLayout_points);
        //为每个pager添加布局,此处布局是一张图片
        ImageView slide1 = new ImageView(this);
        slide1.setImageResource(R.drawable.picture1);
        ImageView slide2 = new ImageView(this);
        slide2.setImageResource(R.drawable.picture2);
        ImageView slide3 = new ImageView(this);
        slide3.setImageResource(R.drawable.picture3);
        list.add(slide1);
        list.add(slide2);
        list.add(slide3);

        viewPager.setAdapter(adapter);
    }

    //适配器,重写四方法,也可以单独写一个类,
    private PagerAdapter adapter = new PagerAdapter() {
        //getCount():返回要滑动的VIew的个数
        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        //做了两件事,第一:将当前视图添加到container中,第二:返回当前View
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(list.get(position));
            return list.get(position);
        }

        //从当前container中删除指定位置(position)的View;
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            //super.destroyItem(container, position, object);
            container.removeView(list.get(position));
        }
    };
}

说明:

1,关于timer.schedule():

  • 第一个参数,是 TimerTask 类,在包:import java.util.TimerTask .使用者要继承该类,并实现public
    void run() 方法,因为 TimerTask 类 实现了 Runnable 接口。
  • 第二个参数的意思是,当你调用该方法后,该方法必然会调用 TimerTask 类 TimerTask 类 中的
    run()方法,这个参数就是这两者之间的差值,转换成汉语的意思就是说,用户调用 schedule()
    方法后,要等待这么长的时间才可以第一次执行run() 方法。
  • 第三个参数的意思就是,第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法。

2、自动播放:

除了使用计时器,还可以使用Thread.sleep方法。
参考我的另一篇博客:
《Handler弱引用举例(ViewPager的自动播放)》

这里写图片描述

如果不是简单图片那么ImageView还可以用一个布局代替,对应的写三个布局文件,然后代码修改一下即可:

viewPager = (ViewPager) findViewById(R.id.viewpager);  
LayoutInflater inflater=getLayoutInflater();  
view1 = inflater.inflate(R.layout.layout1, null);  
view2 = inflater.inflate(R.layout.layout2,null);  
view3 = inflater.inflate(R.layout.layout3, null);  

viewList = new ArrayList<View>();// 将要分页显示的View装入数组中  
viewList.add(view1);  
viewList.add(view2);  
viewList.add(view3);  
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值