ViewPager实现广告轮播效果

现在主流的App都会有一个轮播的广告图片控件,为了提高自己的能力,决定也来实现一下。经过一天努力,终于实现了。效果如下:

实现方法:ViewPager+Handle
实现过程:

public class MainActivity extends AppCompatActivity {
    private PagerAdapter adapter;
    private ViewPager viewPager;
    private List<View> views;
    private static final int AUTOPLAY = 0;//自动播放
    private static final int MANUALLY = 1;//手机播放
    private Myhandler myhandler;
    private ImageView iv_one, iv_two, iv_three;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_one = (ImageView) findViewById(R.id.one);
        iv_two = (ImageView) findViewById(R.id.two);
        iv_three = (ImageView) findViewById(R.id.three);
        InitData();
    }

    private void InitData() {
        myhandler = new Myhandler(this);
        GetAdsData data = new GetAdsData(this);
        data.Add(R.drawable.first);
        data.Add(R.drawable.second);
        data.Add(R.drawable.third);
        views = data.GetData();
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        adapter = new PagerAdapter() {
            @Override
            public int getCount() {
                return Integer.MAX_VALUE;//设置Count为无限大,这样就可以模拟实现循环效果

            }


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

            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                int location = Math.abs(position);
                //location%viewsize 取余数
                if (views.get(location % views.size()).getParent() != null) {
                    ((ViewPager) views.get(location % views.size())
                            .getParent()).removeView(views.get(location
                            % views.size()));
                }


                (container).addView(views.get(location % views.size()), 0);


                return views.get(location % views.size());

            }

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

        //设置位置为中间位置,防止滑到边界点,
        viewPager.setCurrentItem(Integer.MAX_VALUE / 2);
       //默认为自动轮播模式
        myhandler.sendEmptyMessageDelayed(AUTOPLAY, 5000);

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //设置小圆点
                int mark = position % views.size();
                switch (mark) {
                    case 0:
                        iv_three.setImageResource(R.drawable.point_unpress);
                        iv_two.setImageResource(R.drawable.point_unpress);
                        iv_one.setImageResource(R.drawable.point_press);

                        break;
                    case 1:
                        iv_one.setImageResource(R.drawable.point_unpress);
                        iv_two.setImageResource(R.drawable.point_press);
                        iv_three.setImageResource(R.drawable.point_unpress);
                        break;

                    case 2:
                        iv_one.setImageResource(R.drawable.point_unpress);
                        iv_two.setImageResource(R.drawable.point_unpress);
                        iv_three.setImageResource(R.drawable.point_press);

                        break;
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                switch (state) {
                    case ViewPager.SCROLL_STATE_DRAGGING:
                        //当手指碰到ViewPager控件时,发送信息,设置为手动模式
                        myhandler.sendEmptyMessage(MANUALLY);

                        break;

                    case ViewPager.SCROLL_STATE_IDLE:
                        //当手指离开ViewPager时,发送信息,设置为自动模式
                        myhandler.sendEmptyMessageDelayed(AUTOPLAY, 5000);

                        break;
                }

            }
        });
    }


    static class Myhandler extends Handler {
        private WeakReference<MainActivity> weakReference;

        public Myhandler(MainActivity activity) {
            weakReference = new WeakReference<MainActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = weakReference.get();
            if (activity == null) {

                return;
            }
            if (activity.myhandler.hasMessages(AUTOPLAY)) {
                removeMessages(AUTOPLAY);
            }

            switch (msg.what) {
                case AUTOPLAY://设置自动播放信息
                    activity.viewPager.setCurrentItem(activity.viewPager.getCurrentItem() + 1);

                    break;
                case MANUALLY://接收信息,不做任何处理;

                    break;
            }


        }
    }

关键点:
1.设置监听viewpager的滑动事件,在不同的状态下发送不同的信息给Handler。
2.把PagerAdapter的Count设置为Integer.MAX_VALUE,让边界无限大。
3.用position%view.size,标记每张图片的位置。

下载方式:https://pan.quark.cn/s/c9b9b647468b ### 初级JSP程序设计教程核心内容解析#### 一、JSP基础概述JSP(JavaServer Pages)是由Sun Microsystems公司创建的一种动态网页技术规范,主要应用于构建动态网站及Web应用。JSP技术使得开发者能够将动态数据与静态HTML文档整合,从而实现网页内容的灵活性可变性。##### JSP的显著特性:1. **动态与静态内容的分离**:JSP技术支持将动态数据(例如数据库查询结果、实时时间等)嵌入到静态HTML文档中。这种设计方法增强了网页的适应性可维护性。2. **易用性**:开发者可以利用常规的HTML编辑工具来编写静态部分,并通过简化的标签技术将动态内容集成到页面中。3. **跨平台兼容性**:基于Java平台的JSP具有优良的跨操作系统运行能力,能够在多种不同的系统环境中稳定工作。4. **强大的后台支持**:JSP能够通过JavaBean组件访问后端数据库及其他资源,以实现复杂的数据处理逻辑。5. **执行效率高**:JSP页面在初次被请求时会被转换为Servlet,随后的请求可以直接执行编译后的Servlet代码,从而提升了服务响应的效率。#### 二、JSP指令的运用JSP指令用于设定整个JSP页面的行为规范。这些指令通常放置在页面的顶部,向JSP容器提供处理页面的相关指导信息。##### 主要的指令类型:1. **Page指令**: - **语法结构**:`<%@ page attribute="value" %>` - **功能**:定义整个JSP页面的运行特性,如设定页面编码格式、错误处理机制等。 - **实例**: ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值