Viewpager

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值