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自动无限切换可以使用死循环的方式来进行解决。或者使用定时器,和定时任务来实现
    
  • 相关阅读:
    Sprinig.net 双向绑定 Bidirectional data binding and data model management 和 UpdatePanel
    Memcached是什么
    Spring.net 网络示例 codeproject
    jquery.modalbox.show 插件
    UVA 639 Don't Get Rooked
    UVA 539 The Settlers of Catan
    UVA 301 Transportation
    UVA 331 Mapping the Swaps
    UVA 216 Getting in Line
    UVA 10344 23 out of 5
  • 原文地址:https://www.cnblogs.com/shaofeer/p/11154424.html
Copyright © 2011-2022 走看看