ViewPage自动轮播图片

参考

1.https://www.cnblogs.com/whyalwaysme/p/4391688.html

2.https://blog.csdn.net/zhiyuan0932/article/details/52673169

不想看的直接上代码:

https://download.csdn.net/download/luyujian6/10998167

 

MainActivity:

package com.demo.viewpage;

import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

    private Handler handler;
    private ViewPager viewPager;
    private long lastUpdateTime;
    private int currentPosition = 0;
    private final int FIRST_PAGE = 1;
    private final int HANDLE_MSG = 2;
    private final int SLEEP_TIME = 5 * 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initHandle();
        viewPager = findViewById(R.id.view_page);

        ViewPageAdapter adapter = new ViewPageAdapter(this, initData());
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(FIRST_PAGE, false);
        handler.sendEmptyMessageDelayed(HANDLE_MSG, SLEEP_TIME);
        viewPager.setOnPageChangeListener(this);

    }


    private int[] initData() {
        //一共显示四张图片,但是为了轮询,在数组的最后加第一张图片的位置,在数组的第一张加最后一张图
        int resource0 = R.mipmap.image4;//
        int resource1 = R.mipmap.image1;
        int resource2 = R.mipmap.image2;
        int resource3 = R.mipmap.image3;
        int resource4 = R.mipmap.image4;
        int resource5 = R.mipmap.image1;

        return new int[]{resource0, resource1, resource2, resource3, resource4, resource5};
    }

    private void initHandle() {
        if (handler != null) {
            return;
        }

        handler = new Handler(getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what != HANDLE_MSG) {
                    return;
                }

                long intervalTime = 0;
                if (lastUpdateTime > 0) {
                    intervalTime = (System.currentTimeMillis() - lastUpdateTime);
                    //如果不到达指定的更新时间,不去更新,因为当展示的ViewPage被滑动不可见,当下一次再被滑动回来可见的时候,这里的时间会被混乱,所以这里需要重置
                    if (intervalTime < SLEEP_TIME) {
                        intervalTime = SLEEP_TIME - intervalTime;
                        sendEmptyMessageDelayed(HANDLE_MSG, intervalTime);
                        return;
                    }
                }


                //重置更新时间
                lastUpdateTime = System.currentTimeMillis();
                //当前正在展示的图片位置+1等于下一个图片展示的位置
                currentPosition = viewPager.getCurrentItem() + 1;
                //计算出位置之后,走位置是否需要重置流程
                resetPosition(currentPosition);
                viewPager.setCurrentItem(currentPosition, false);
                //继续发送消息,触发下一次更新
                sendEmptyMessageDelayed(HANDLE_MSG, SLEEP_TIME);
            }
        };
    }


    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        resetPosition(position);

    }

    @Override
    public void onPageScrollStateChanged(int state) {
        //更新展示图片
        if (state == ViewPager.SCROLL_STATE_IDLE) {
            //因为这里是手动滑动更新进来的位置,必须把上一次自动轮询的消息移除,避免重复多次更新,为了性能优化,最后这个viewPage不可见的时候停止更新,出现的时候再更新
            handler.removeMessages(HANDLE_MSG, null);
            viewPager.setCurrentItem(currentPosition, false);
            //更新完之后继续发送消息自动更新
            handler.sendEmptyMessageDelayed(HANDLE_MSG, SLEEP_TIME);
        }
    }

    //重置展示位置
    private void resetPosition(int position) {
        //当前展示的图片等于最后位置的时候,重置到第一张图的位置
        if (position == initData().length - 1) {
            currentPosition = FIRST_PAGE;
            return;
        }

        //当前位置等于最后一项位置的时候,重置到最后一张图的位置
        if (position == 0) {
            currentPosition = initData().length - 2;
            return;
        }

        //不是首尾位置,正常顺序展示
        currentPosition = position;
    }

    //注意:viewPager.setCurrentItem记得是带参数false,也就是这个viewPager.setCurrentItem(currentPosition, false),不然会出现首尾切换轮播的时候不平滑

}

 

二 Adapter文件

package com.demo.viewpage;

import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * Created by luyujian on 2019/3/5.
 */

public class ViewPageAdapter extends PagerAdapter {

    private Activity activity;
    private int[] imageResourceIdList;

    public ViewPageAdapter(Activity activity, int[] imageResourceIdList) {
        this.activity = activity;
        this.imageResourceIdList = imageResourceIdList;
    }

    @Override
    public int getCount() {
        return imageResourceIdList.length;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //绑定自定义xml,填充数据
        View view = View.inflate(activity, R.layout.main_view_page_item, null);
        TextView textView = view.findViewById(R.id.view_page_text);
        LinearLayout groupPoint = view.findViewById(R.id.view_page_point_group);

        textView.setText("这里的Position:" + position);
        ImageView imageView = view.findViewById(R.id.view_page_image);
        imageView.setImageResource(imageResourceIdList[position]);
        //填充小圆点
        setPointState(groupPoint, position);

        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    private void setPointState(LinearLayout groupPoint, int position) {
        for (int i = 0; i < imageResourceIdList.length - 2; i++) {
            ImageView point = new ImageView(activity);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20, 20);
            params.rightMargin = 35;
            point.setLayoutParams(params);
            point.setBackgroundResource(R.drawable.point_bg);

            if (i == position - 1) {
                point.setEnabled(true);
            } else {
                point.setEnabled(false);
            }
            groupPoint.addView(point);
        }
    }
}

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值