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,标记每张图片的位置。

基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不依赖物理位置传感器的情况下,如何通过算法实现对电机转子位置速度的精确估计与控制。文中结合嵌入式开发平台STM32 F4,采用如滑模观测器、扩展卡尔曼滤波或高频注入法等先进观测技术,实现对电机反电动势或磁链的估算,进而完成无传感器矢量控制(FOC)。同时,研究涵盖系统建模、控制算法设计、仿真验证(可能使用Simulink)以及在STM32硬件平台上的代码实现与调试,旨在提高电机控制系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电力电子、自动控制理论基础嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师。; 使用场景及目标:①掌握永磁同步电机无位置传感器控制的核心原理与实现方法;②学习如何在STM32平台上进行电机控制算法的移植与优化;③为开发高性能、低成本的电机驱动系统提供技术参考与实践指导。; 阅读建议:建议读者结合文中提到的控制理论、仿真模型与实际代码实现进行系统学习,有条件者应在实验平台上进行验证,重点关注观测器设计、参数整定及系统稳定性分析等关键环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值