ViewPager无限轮播,简单实现

//不墨迹,直接上

public class PagerAdapter extends android.support.v4.view.PagerAdapter {
    private List<pagerData> viewlist;
    private Context context;
    public PagerAdapter(Context context,List<pagerData> viewlist) {
        this.viewlist = viewlist;
        this.context=context;
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view==object;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = View.inflate(context, R.layout.tulayout, null);
        ImageView ggtv =(ImageView) view.findViewById(R.id.imageView);
        //ViewPager页号求模取出View列表中要显示的项
        position %= viewlist.size();
        if (position<0){
            position = viewlist.size()+position;
        }

        pagerData data = viewlist.get(position);
        ggtv.setImageResource(data.getData());
        container.addView(view);
        return view;
    }

}
 
public class Main2Activity extends AppCompatActivity {

    private ViewPager vp;
    private LinearLayout ll_dots;
    private ArrayList<ImageView> dotsList;
    private List<pagerData> pagerlist;
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==1){
                int db = vp.getCurrentItem();
                db++;
                vp.setCurrentItem(db);
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        vp=(ViewPager)findViewById(R.id.vp);
        ll_dots=(LinearLayout)findViewById(R.id.lllllll);
        pagerlist=new ArrayList<>();
        pagerlist.add(new pagerData(R.drawable.aaa));
        pagerlist.add(new pagerData(R.drawable.bbb));
        pagerlist.add(new pagerData(R.drawable.ccc));
        pagerlist.add(new pagerData(R.drawable.ddd));
        vp.setAdapter(new PagerAdapter(this,pagerlist));
        vp.setCurrentItem(pagerlist.size()*100);
        initDots();
        vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                //遍历存放图片的数组
                for (int i = 0; i < pagerlist.size(); i++) {
                    //判断小点点与当前的图片是否对应,对应设置为亮色 ,否则设置为暗色
                    if (i == position % pagerlist.size()) {
                        dotsList.get(i).setImageDrawable(getResources().getDrawable(R.drawable.yuandiana));
                    } else {
                        dotsList.get(i).setImageDrawable(getResources().getDrawable(R.drawable.yuandianb));
                    }
                }
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
//        为了简单,这里选择了休眠
        new Thread(){
            @Override
            public void run() {
                super.run();
                while (true){
                    try {
                        sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.sendEmptyMessage(1);
                }
            }
        }.start();
//        添加点击事件
        vp.setOnTouchListener(new View.OnTouchListener() {
            int touchFlag = 0;
            float x = 0, y = 0;
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                ViewConfiguration configuration = ViewConfiguration.get(Main2Activity.this);
                int mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        touchFlag = 0;
                        x = motionEvent.getX();
                        y = motionEvent.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        float xDiff = Math.abs(motionEvent.getX() - x);
                        float yDiff = Math.abs(motionEvent.getY() - y);
                        if (xDiff < mTouchSlop && xDiff >= yDiff)
                            touchFlag = 0;
                        else
                            touchFlag = -1;
                        break;
                    case MotionEvent.ACTION_UP:
                        if (touchFlag == 0) {
                            int item = vp.getCurrentItem();
                            int a = pagerlist.size();

                            for(int i=0;i<a;i++){
                                int b = item%a;
                                Intent intent=new Intent(Main2Activity.this,MainActivity.class);
//                                int ids = pagerlist.get(b).getData();
//                                intent.putExtra("id",id);
                                startActivity(intent);
                                break;
                            }

                        }
                        break;
                }
                return false;
            }
        });
    }
    private void initDots() {
        //创建存放小点点的集合
        dotsList = new ArrayList<ImageView>();
        //每次初始化之前清空集合
        dotsList.clear();
        // 每次初始化之前  移除  布局中的所有小点
        ll_dots.removeAllViews();
        for (int i = 0; i < pagerlist.size(); i++) {
            //创建小点点图片
            ImageView imageView = new ImageView(this);
            Drawable drawable = null;
            if (i == 0) {
                // 亮色图片
                drawable = getResources().getDrawable(R.drawable.yuandiana);

            } else {
                drawable = getResources().getDrawable(R.drawable.yuandianb);
            }
            imageView.setImageDrawable(drawable);
            // 考虑屏幕适配
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dip2px(this, 10), dip2px(this, 10));
            //设置小点点之间的间距
            params.setMargins(dip2px(this, 5), 0, dip2px(this, 5), 0);
            //将小点点添加大线性布局中
            ll_dots.addView(imageView, params);
            // 将小点的控件添加到集合中
            dotsList.add(imageView);
        }
    }
    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ViewPager实现轮播图需要以下步骤: 1. 在布局文件中添加ViewPager控件。 2. 编写适配器Adapter,将图片加载到ViewPager中。 3. 在Activity中,实例化ViewPager和Adapter,并将Adapter设置给ViewPager。 4. 在Adapter中,重写instantiateItem方法,返回加载的视图,并设置监听器,实现无限循环滚动效果。 5. 使用Handler和Runnable实现自动轮播功能。 以下是一个简单的示例代码: 1. 布局文件中添加ViewPager控件: ``` <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="200dp" /> ``` 2. 编写适配器Adapter,将图片加载到ViewPager中: ``` public class ViewPagerAdapter extends PagerAdapter { private Context context; private int[] images; public ViewPagerAdapter(Context context, int[] images) { this.context = context; this.images = images; } @Override public int getCount() { return images.length; } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setImageResource(images[position]); container.addView(imageView); return imageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((ImageView) object); } } ``` 3. 在Activity中,实例化ViewPager和Adapter,并将Adapter设置给ViewPager: ``` ViewPager viewPager = findViewById(R.id.viewPager); int[] images = {R.drawable.image1, R.drawable.image2, R.drawable.image3}; ViewPagerAdapter adapter = new ViewPagerAdapter(this, images); viewPager.setAdapter(adapter); ``` 4. 在Adapter中,重写instantiateItem方法,返回加载的视图,并设置监听器,实现无限循环滚动效果: ``` @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setImageResource(images[position]); container.addView(imageView); // 设置监听器,实现无限循环滚动效果 imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int currentPosition = viewPager.getCurrentItem(); if (currentPosition == images.length - 1) { viewPager.setCurrentItem(0); } else { viewPager.setCurrentItem(currentPosition + 1); } } }); return imageView; } ``` 5. 使用Handler和Runnable实现自动轮播功能: ``` private Handler handler = new Handler(); private Runnable runnable = new Runnable() { @Override public void run() { int currentPosition = viewPager.getCurrentItem(); if (currentPosition == images.length - 1) { viewPager.setCurrentItem(0); } else { viewPager.setCurrentItem(currentPosition + 1); } handler.postDelayed(this, 3000); } }; @Override protected void onResume() { super.onResume(); handler.postDelayed(runnable, 3000); } @Override protected void onStop() { super.onStop(); handler.removeCallbacks(runnable); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值