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);
}
下一篇: WPF数据绑定
推荐阅读
-
Android仿IOS ViewPager滑动进度条
-
Android ViewPager实现图片轮翻效果
-
Android自定义View Flyme6的Viewpager指示器
-
Android中viewPager使用指南
-
Android 使用ViewPager实现左右循环滑动及轮播效果
-
Android实现带指示器的自动轮播式ViewPager
-
Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件
-
Android viewpager中动态添加view并实现伪无限循环的方法
-
Android viewpager 3D画廊的实现方法
-
Android viewpager无限轮播获取网络图片功能