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

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;
}

}

相关标签: ViewPager