zoukankan      html  css  js  c++  java
  • Android之无限轮播图源代码

    Android轮播广告图是大家经常用到的一个控件今天便撸了一把代码

    实现步骤

    使用Viewpager进行实现图片滑动

    设置ViewPager的数据,让其无限切换

    Activity代码

    
    public class PageBanner2Activity extends AppCompatActivity {
    
        private ViewPager mVp_content;
        private List<ImageView> mViewArrayList;
        private LinearLayout mLl_point;
        private int prePosition = 0;
        private boolean isRunning = true;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_page_banner2);
            initView();
        }
    
    
        private void initView() {
            mVp_content = (ViewPager) findViewById(R.id.vp_content);
    
            mLl_point = (LinearLayout) findViewById(R.id.ll_point);
    
            initData();
    
    
            startLunBO();
            mVp_content.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            Log.e("PageBanner2Activity", "PageBanner2Activity onTouch()点击");
                            isRunning = false;
                            break;
                        case MotionEvent.ACTION_UP:
                            Log.e("PageBanner2Activity", "PageBanner2Activity onTouch()抬起");
                            isRunning = true;
                            break;
    
                        case MotionEvent.ACTION_MOVE:
                            isRunning = false;
                            Log.e("PageBanner2Activity", "PageBanner2Activity onTouch()抬起");
    
                            break;
                    }
    
                    return false;
                }
            });
        }
    
        private void startLunBO() {
            //开启轮播
            new Thread() {
                public void run() {
                    while (isRunning) {
    
                        SystemClock.sleep(2000);
    
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mVp_content.setCurrentItem(mVp_content.getCurrentItem() + 1);
                            }
                        });
    
                    }
                }
            }.start();
    
        }
    
    
        private void initData() {
            mViewArrayList = new ArrayList<>();
    
            int[] imageIds = {R.mipmap.a, R.mipmap.b, R.mipmap.c, R.mipmap.d, R.mipmap.e};
    
            LinearLayout.LayoutParams layoutParams;
            View pointView;
    
            ImageView imageView;
    
            for (int i : imageIds) {
                imageView = new ImageView(this);
                imageView.setBackgroundResource(i);
    
                mViewArrayList.add(imageView);
    
                //创建小白点
                pointView = new View(this);
                pointView.setBackgroundResource(R.drawable.selector_point_bg);
    
                //添加到布局中
                layoutParams = new LinearLayout.LayoutParams(20, 20);
    
                if (i != 0) {
                    layoutParams.leftMargin = 20;
                }
    
                //默认不选中
                pointView.setEnabled(false);
                mLl_point.addView(pointView, layoutParams);
            }
    
            //默认选中第一个
            mLl_point.getChildAt(0).setEnabled(true);
    
    
            //设置数据适配器
            MyPagerAdapter2 myPagerAdapter = new MyPagerAdapter2();
            mVp_content.setAdapter(myPagerAdapter);
    
    
            //添加监听
            mVp_content.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
                }
    
                @Override
                public void onPageSelected(int position) {
                    int newPosition = position % mViewArrayList.size();
    
                    mLl_point.getChildAt(prePosition).setEnabled(false);
                    mLl_point.getChildAt(newPosition).setEnabled(true);
                    prePosition = newPosition;
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
    
                }
            });
    
    
            int pos = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % mViewArrayList.size());
    
            mVp_content.setCurrentItem(pos);
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            isRunning = false;
        }
    }   

    ViewPager的数据适配器

    
    class MyPagerAdapter2 extends PagerAdapter {
    
            @Override
            public int getCount() {
                //为了让其无限滑动,所以加大轮播图的数据
                return Integer.MAX_VALUE;
            }
    
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
    
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
    
                int newPosition = position % mViewArrayList.size();
    
    
                ImageView imageView = mViewArrayList.get(newPosition);
    
                container.addView(imageView);
    
                return imageView;
            }
    
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView((View) object);
            }
        }

    activity.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="200dp">
    
            <android.support.v4.view.ViewPager
                android:id="@+id/vp_content"
                android:layout_width="match_parent"
                android:layout_height="200dp"/>
    
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:background="#878787"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:text="落花人独立微雨燕双飞"
                    android:textColor="@android:color/white"
                    android:textSize="20sp"/>
    
                <LinearLayout
                    android:id="@+id/ll_point"
                    android:layout_width="match_parent"
                    android:layout_height="20dp"
                    android:gravity="center"
                    android:orientation="horizontal"></LinearLayout>
            </LinearLayout>
        </RelativeLayout>
    
    </LinearLayout>
    

    具体细节问题

    如何设置ViewPager可以无限循环切换

    我在代码中是这样设置的,首先设置ViewPager数据适配器中的返回数据个数为int的最大值,然后在instantiateItem方法中对position进行计算转换。随后在第一次加载ViewPager的时候,进行设置当前选中的条目为0--Integer.MAX_VALUE中间的一个值,从而就实现了左滑不会到头,右滑不会到头的展示状态
    

    如何设置ViewPager自动的切换

    设置ViewPager自动无限切换可以使用死循环的方式来进行解决。或者使用定时器,和定时任务来实现
    
  • 相关阅读:
    零基础学python-2.6 数字与字符串
    零基础学python-2.5 变量与赋值
    零基础学python-2.4 操作符
    零基础学python-2.3 注释
    js原型和原型链
    ES6数据结构Set、Map
    JS高阶函数--------map、reduce、filter
    vue-cli3.0以上项目中引入jquery的方法
    vue项目中使用echarts map报错Cannot read property 'push' of undefined nanhai.js
    js 将时间戳转成时间格式化
  • 原文地址:https://www.cnblogs.com/shaofeer/p/11154424.html
Copyright © 2011-2022 走看看