欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Viewpager

程序员文章站 2022-06-09 15:55:36
...

ublic class MainActivity extends AppCompatActivity {
// 将ViewPager定义为全局变量,方便使用.
private ViewPager viewpager_vp;
// 建立一个ArrayList集合.泛型指定为ImageView.
private ArrayList ImageViews = new ArrayList();
//图片int数组资源
private int[] imageResIds = {
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e,
};
//图片字符串数组String[]资源.
private String[] descs = {
“巩俐不低俗,我就不能低俗”,
“扑树又回来啦!再唱经典老歌引万人大合唱”,
“揭秘北京电影如何升级”,
“乐视网TV版大派送”,
“热血屌丝的反杀”,
};

private LinearLayout ll_dot;
private TextView viewPager_tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //对控件进行初始化
    init();
}

/**
 * 对VIewPager进行初始化.
 */
private void init() {
    //找到可以设置点的容器LinearLayout的对象,进行点的添加
    ll_dot = (LinearLayout) findViewById(R.id.ll_dot);
    //找到文本的对象.
    viewPager_tv = (TextView) findViewById(R.id.ViewPager_tv);

    //找到VIewPager对象.
    viewpager_vp = (ViewPager) findViewById(R.id.viewpager_vp);

    //更加图片int数组资源的数量,动态的创建ImageView控件.就是有几张图片,创建几个ImageView,for循环
    for (int x = 0; x < imageResIds.length; x++) {
        //创建ImageView对象
        ImageView imageView = new ImageView(this);
        //通过该对象添加图片资源..setBackgroundResource方法.
        imageView.setBackgroundResource(imageResIds[x]);
        //把控件添加到集合ImageViews中去,以方便在VIewPager的适配器里instantiateItem方法获取.
        ImageViews.add(imageView);
        //进行点的添加,其个数和图片的个数一致,因此放到该循环中,
        createDot(x);
    }

    //设置适配器.setAdapter
    viewpager_vp.setAdapter(new MyViewpagerAdapter());

    //设置ViewPager的滑动监听器,addOnPageChangeListener,set的方法因为名字的原因被淘汰了
    viewpager_vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            //同过getCurrentItem方法拿到当前用户所交互ViewPager的item位置.
            int currentItem = viewpager_vp.getCurrentItem();
            //通过得到的这个item,给text和点进行选中的设置.
            changeTextandDot(currentItem);
        }
        @Override
        public void onPageSelected(int position) {

        }
        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });


}

/**
 * 注意:看一个方法或类的信息快捷键:Ctrl+Q;
 * 像ListVIew一样,创建一个ViewPager的适配器,自定义一个类继承PagerAdapter
 */
class MyViewpagerAdapter extends PagerAdapter {
    //getContent,设置ViewPager的条目个数.一般就是集合或者资源数组的长度.
    @Override
    public int getCount() {
        return ImageViews.size();
    }

    //isViewFromObject,判断ViewPager的条目View对象和InstantiateItem返回的Object对象是否一致,固定格式:return view==object;
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    //Ctrl+H:看到一个类的基础结构图    ctrl+h+l:快速格式化.
    //instantiateItem,ViewPager添加条目的操作.container:VIewPager的化身,控件都是添加到他身上,position:代表用户滑动条目的位置
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //根据条目所在位置(利用Position),从ImageViews集合里获取相对应的ImageVIew图片.
        ImageView imageView = ImageViews.get(position);
        //把得到ImageView对象,添加给VIewPager对象,也就是container,使用addView
        container.addView(imageView);
        //注意:你添加给VIewPager什么控件,就要返回该控件,给isViewFromObject进行比较判断,这里添加的是ImageView,返回的就是ImageView
        return imageView;
    }

    //防止内存泄漏.相当于ListView的复用container,销毁一个page,该方法的实际就是将instantiateItem返回的VIew对象从ViewPager中移除,
    //container:还是ViewPager控件自身 position: object:则代表了View控件,使用时要强转成View一下
    //补充:为什么参数是Object,而不直接是View,因为虽然99%是view,但也有可能是Fragment,所以用Object,提高了可扩展性.
    //构造方法删除后,也是固定格式:container.removeView((View) object);
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}

/**
 * 根据ViewPager的item的变化,也就是图片切换的操作,设置对应的点和文本.
 * @param  position int ViewPager的item,也是图片的位置
 */
public void changeTextandDot(int position){
    //根据ViewPager的item的变化,设置对应的文本.setText(descs[position]);
    viewPager_tv.setText(descs[position]);
    //对点进行判断是否是当前页的点,用for循环,拿到所有点的位置,然后和position对比
    for(int x=0; x< imageResIds.length; x++){
        //.getChildAt(x);拿到容器的子控件.得到VIew对象
        View childAt = ll_dot.getChildAt(x);
        //为View设置背景图片,,使用三元运算符.
        childAt.setBackgroundResource(x==position?R.drawable.dot_focus:R.drawable.dot_normal);
    }

}

/**
 * 更加图片资源的数量,动态的创建点
 */
private void createDot(int x) {
    //创建一个View对象;
    View view= new View(this);
    //为这个View对象设置背景setBackgroundResource
    view.setBackgroundResource(R.drawable.dot_normal);
    //为View对象设置宽高参数,使用参数对象LayoutParams(int,int),给哪个容器,就用哪个容器创建
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(8,8);
    //使用参数对象LayoutParams.leftMargin=int,相当于布局里的padding.
    layoutParams.leftMargin=8;
    //把准备好的layoutParams参数对象,设置给View对象.setLayoutParams
    view.setLayoutParams(layoutParams);
    //最后容器对象.addView(VIwe);
    ll_dot.addView(view);
}
相关标签: viewpager