ViewPager完美无瑕版
程序员文章站
2022-06-09 16:08:16
...
一、布局
<?xml version="1.0" encoding="utf-8"?><android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="200dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#88000000"
android:padding="8dp"
android:gravity="center_horizontal"
android:layout_alignBottom="@id/pager">
<!--跟着图片摇摆的文本-->
<TextView
android:id="@+id/vp_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#fff"
android:text="辉哥好那啥"/>
<!--写一个线性布局容器用来设置小圆点-->
<LinearLayout
android:id="@+id/ll_dot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
**二、MainActivityb代码**
public class MainActivity extends AppCompatActivity {
private ViewPager mViewPager;
private TextView mText;
private LinearLayout ll_dot;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
//获取当前用户交互的条目
int currentItem = mViewPager.getCurrentItem();
//设置当前显示的条目,当前条目+1就是让他向前走
mViewPager.setCurrentItem(currentItem + 1);
//通过静态的方法重复执行命令
handler.sendEmptyMessageDelayed(1,3000);
break;
}
}
};
//创建集合存放图片资源
ArrayList<ImageView> imageViews = new ArrayList<>();
//创建int型的图片数组
private int imageRsIds[] = {
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e
};
//创建String类型的数组存取图片的每一个Text
private String describe[] = {
"我是一",
"我是二",
"我是三",
"我是四",
"我是五"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
init();
//设置适配器
MyPagerAdapter adapter = new MyPagerAdapter(imageViews,this);
mViewPager.setAdapter(adapter);
//设置监听事件
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
//在屏幕滚动过程中不断被调用
@Override
public void onPageScrolled(int i, float v, int i1) {
//获取当前用户交互的item位置
int currentItem = mViewPager.getCurrentItem();
changeDotAndText(currentItem % imageViews.size());
}
//手指滑动翻页,翻页成功,手指抬起会调用这个方法,i就是当前页数
@Override
public void onPageSelected(int i) {
}
//在手指发生变化会改变,手指按下会触发这个方法
@Override
public void onPageScrollStateChanged(int i) {
}
});
//实现向左无限滑动,因为这里的currentItem默认是从0开始,所以不能向左滑,这里只需要设置一个默认值就行了
mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 - 3); //Integer.MAX_VALUE / 2 - 3设置一个最大的数,防止有人没事干一直滑动
//发送handler
handler.sendEmptyMessageDelayed(1,3000);
//设置ViewPager触摸时间
ViewPagerTouchExent();
}
//ViewPager处理触摸时间
private void ViewPagerTouchExent() {
mViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//获取当前手指的动作
switch (event.getAction()){
//按下
case MotionEvent.ACTION_DOWN:
//停止发送
handler.removeMessages(1);
break;
//手指抬起
case MotionEvent.ACTION_UP:
//继续发送
handler.sendEmptyMessageDelayed(1,3000);
break;
//手指在滑动
case MotionEvent.ACTION_MOVE:
//停止发送
handler.removeMessages(1);
break;
}
return false;
}
});
}
//改变圆点和文本
private void changeDotAndText(int currentItem) {
//向文本中设置对用数组的字符串
mText.setText(describe[currentItem]);
//对点进行判断
for (int x = 0 ; x < imageRsIds.length ; x++){
//拿到容器的子控件,得到View对象
View childAt = ll_dot.getChildAt(x);
//设置小圆点,这里用三目运算符,如果和当前下标相同,就设置一张红点图片,反之空心点图片
childAt.setBackgroundResource(x == currentItem ? R.drawable.dot_focus : R.drawable.dot_normal);
}
}
private void init() {
mViewPager = findViewById(R.id.pager);
mText = findViewById(R.id.vp_text);
ll_dot = findViewById(R.id.ll_dot);
//根据图片的数量动态的创建ImageView
for(int x = 0 ;x < imageRsIds.length ; x++){
ImageView imageView = new ImageView(this);
//为每一个imageView添加资源
imageView.setBackgroundResource(imageRsIds[x]);
//把imageView添加到集合中去,以方便我们使用适配器中的instantiateItem的获取
imageViews.add(imageView);
//添加点
dot();
}
}
//动态的创建点
private void dot() {
//创建一个View对象,这个控件是最原始的,相当于空白布局
View view = new View(this);
//添加空心圆点图片
view.setBackgroundResource(R.drawable.dot_normal);
//为view控件设置宽和高参数,给哪个容器就用哪个容器创建
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(8, 8);
//leftMargin = int , 相当于 布局中的padding
layoutParams.leftMargin = 8 ;
//把准备好的参数对象设置给ViewPager对象
view.setLayoutParams(layoutParams);
//再把view添加给点容器布局
ll_dot.addView(view);
}
//销毁handler
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
}
}
三、适配器
public class MyPagerAdapter extends PagerAdapter {
private List<ImageView> mList;
private Context context;
//有参构造
public MyPagerAdapter(List<ImageView> mList, Context context) {
this.mList = mList;
this.context = context;
}
//设置条目个数
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
//判断ViewPager和ViewPager返回的对象是否一致
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}
//将view对象从viewPager中移除,防止内存泄漏
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
//为什么不直接是view而是object? 因为虽然大部分都是View但是也有可能是Fragment,所以我们这样做提升了可扩展性
container.removeView((View) object);
}
//为ViewPager添加条目
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
//获取集合中对应的图片,因为前面已经添加过了,直接获取就行
ImageView imageView = mList.get(position % mList.size());
//把对象添加到ViewPager
container.addView(imageView);
//返回对象
return imageView;
}
}
推荐阅读
-
微请注意!Win10 1903版将强制升级至1909或2004版本
-
微信安卓版怎么开启边写边译? 微信英文边写边译的使用方法
-
在最新测试版中微软已修复Windows 11与AMD处理器出现的兼容问题
-
Spring Cloud Finchley.SR1版本遇到的坑以及解决方案
-
120Hz流速屏 Redmi K30 5G 128GB版降价:到手1999
-
Ubuntu 16.04 Server Edition 英文版安装教程
-
小米10青春版号称“满屏钻石” 雷军:每片均调教、素质绝对好
-
如何使用PQ 分区魔术师中文版进行分区操作(图文教程)
-
RedmiBook 14锐龙版售3599:锐龙R5加持 16G内存+512G存储
-
Ubuntu 16.04 中文版安装基础入门教程(图文)