ViewPager实现循环滑动实现方法+定时自动滑动实现方法详解

本文介绍如何使用ViewPager实现带有三个广告页的循环滑动效果,并加入定时自动切换及用户触控滑动功能。此外,还实现了点击广告跳转到对应网址的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

ViewPager实现循环滑动实现方法+定时自动滑动实现方法详解

 

要实现如下效果顶部有一行广告条,包含三页每过一段时间自动显示下一个广告页,当前显示最后一页广告的时候下一页是第一页。另外支持用户手段滑动(左右无限滑动,当前是第一页的时候往左滑动,显示最后一下,当前是最后一页的时候往右滑动显示第一页)。点击广告条的时候,打开指定网页。

 

 

实现方法的思路:有3个页面(ABC),则我们提供5也页面(XABCY其中X和Y没有任何实际意义) 给Pager的Adapter

 

Fragment中的关键代码:

private ViewPager mAdPager = null;//定义pager

    private int mCurrentAdPageIndex = 1 ;//用于记录当前page的页码

privateImageView[] mAdIndicatorImageViews = null ;//用于标记当前是在哪个页面的图标,这里用五角星,高亮表示选中

 

 

 

 

 

    private Handler mUiHandler = null ; //用于实现timer

 

    privateAdItemClickListener mAdItemClickListener = null ;//点击事件监听器

     

 

private voidinitAdPager() {

        ViewGroup group =(ViewGroup) getActivity()

                .findViewById(R.id.viewGroup) ;

        mAdItemClickListener = newAdItemClickListener() ;

        //存放的是三张广告背景img1 img2 img3

        List<View> advPics = newArrayList<View>() ;

        ImageView img1 = newImageView(getActivity()) ;

        img1.setBackgroundResource(R.drawable.ad_1) ;

        img1.setOnClickListener(mAdItemClickListener) ;

        img1.setTag("http://www.baidu.com") ;

       

        ImageView img2 = newImageView(getActivity()) ;

        img2.setBackgroundResource(R.drawable.ad_2) ;

        img2.setOnClickListener(mAdItemClickListener) ;

        img2.setTag("http://www.163.com") ;

       

        ImageView img3 = newImageView(getActivity()) ;

        img3.setBackgroundResource(R.drawable.ad_3) ;

        img3.setOnClickListener(mAdItemClickListener) ;

        img3.setTag("http://www.qq.com") ;

       

        // img1 img2 img3 循环滑动

        // img0 img1img2 img3 img4

        ImageView img0 = newImageView(getActivity()) ;

        ImageView img4 = newImageView(getActivity()) ;

        advPics.add(img0) ;

        advPics.add(img1) ;

        advPics.add(img2) ;

        advPics.add(img3) ;

        advPics.add(img4) ;

       

        // imageviews进行填充

        mAdIndicatorImageViews = newImageView[advPics.size() - 2] ;

        // 小图标

        for (int i = 0; i < advPics.size() -2; i++) {

            ImageView imageView = newImageView(getActivity()) ;

            LinearLayout.LayoutParams lp = newLinearLayout.LayoutParams(20,20);

            lp.setMargins(0,0, 20, 0);//modify 20 to a suitable value

            imageView.setLayoutParams(lp) ;

            mAdIndicatorImageViews[i] = imageView ;

            if (i == 0) {

                mAdIndicatorImageViews[i]

                       .setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;

            } else {

                mAdIndicatorImageViews[i]

                       .setBackgroundResource(R.drawable.music_handle_favorites_normal_icon) ;

            }

            group.addView(mAdIndicatorImageViews[i]) ;

        }

        mAdPager =(ViewPager) getActivity().findViewById(R.id.adv_pager) ;

        mAdPager.setOffscreenPageLimit(5);

        mAdPager.setAdapter(newAdvAdapter(advPics)) ;

        mAdPager.setOnPageChangeListener(newAdPageChangeListener()) ;

        mAdPager.setOnTouchListener(newOnTouchListener() {

            @Override

            public booleanonTouch(View v, MotionEvent event) {

                switch (event.getAction()){

                    caseMotionEvent.ACTION_DOWN:

                    case MotionEvent.ACTION_MOVE:

                        //Log.d(TAG,"onTouch down or move") ;

                       pauseShowNextAdPageDelay() ;

                        break ;

                    caseMotionEvent.ACTION_UP:

                        showNextAdPageDelay() ;

                        //Log.d(TAG,"onTouch up") ;

                        break ;

                    default:

                        break ;

                }

                return false ;

            }

        }) ;

        mAdPager.setCurrentItem(mCurrentAdPageIndex, false) ;

        showNextAdPageDelay() ;

       

    }

   

    private Runnable mShowAdNextRunnable = newRunnable() {

        @Override

        public void run() {

            int index = ++mCurrentAdPageIndex % (mAdIndicatorImageViews.length + 1) ;

            if(index == 0) {

                mCurrentAdPageIndex = 1;

                index = 1;

            }

            mAdPager.setCurrentItem(index, false) ;

            showNextAdPageDelay() ;

        }

    } ;

   

    private voidshowNextAdPageDelay() {

        mUiHandler.postDelayed(mShowAdNextRunnable, 4500) ;

    }

   

    private voidpauseShowNextAdPageDelay() {

        mUiHandler.removeCallbacks(mShowAdNextRunnable) ;

    }

   

    private classAdItemClickListener implements OnClickListener {

       

        @Override

        public voidonClick(View v) {

            Object tag = v.getTag();

            Log.d(TAG, "onClick()") ;

            if (!(tag instanceof String)){

                Log.d(TAG, "tagis not a string") ;

                return ;

            }

            String url =(String) tag ;

            if ("".equals(url)) {

                Log.d(TAG, "urlis empty") ;

                return ;

            }

            openBrowserWithUrl(url) ;

        }

       

    }

   

    private voidopenBrowserWithUrl(String url) {

        Intent intent = newIntent(Intent.ACTION_VIEW) ;

        intent.setData(Uri.parse(url)) ;

        startActivity(intent) ;

    }

   

    private final classAdPageChangeListener implements OnPageChangeListener{

        boolean mIsAutoScrolled = false ;

       

        @Override

        public voidonPageScrollStateChanged(int arg0) {

            Log.d(TAG, "onPageScrollStateChangedarg0 = " + arg0 + ", currentIdex = " + mAdPager.getCurrentItem());

            switch (arg0) {

                caseViewPager.SCROLL_STATE_DRAGGING:// 手势滑动

                    mIsAutoScrolled = false ;

                    break ;

                caseViewPager.SCROLL_STATE_SETTLING:// 界面切换

                    mIsAutoScrolled = true ;

                    break ;

                caseViewPager.SCROLL_STATE_IDLE:

                    if (mAdPager.getCurrentItem()== mAdPager.getAdapter()

                            .getCount() - 2&& !mIsAutoScrolled) {

                        mAdPager.setCurrentItem(1);

                        return ;

                    }

                    if (mAdPager.getCurrentItem()== 1 && !mIsAutoScrolled) {

                        mAdPager.setCurrentItem(mAdPager.getAdapter()

                                .getCount() -2) ;

                        return ;

                    }

                    break ;

                default:

                    break ;

            }

        }

       

        @Override

        public voidonPageScrolled(int arg0, float arg1, int arg2) {

           

        }

       

        @Override

        public voidonPageSelected(int arg0) {

            Log.d(TAG, "onPageSelected: " + arg0);

            for (int i = 0; i < mAdIndicatorImageViews.length; i++) {

                mAdIndicatorImageViews[i]

                       .setBackgroundResource(R.drawable.music_handle_favorites_normal_icon) ;

            }

            if(arg0 > mAdIndicatorImageViews.length) {

                Log.d(TAG, "setCurrentItem" + 1);

                mAdPager.setCurrentItem(1,false) ;

                mAdIndicatorImageViews[1 - 1]

                       .setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;

            }else if(arg0 < 1) {

                Log.d(TAG, "setCurrentItem" + mAdIndicatorImageViews.length);

                mAdPager.setCurrentItem(mAdIndicatorImageViews.length, false) ;

                mAdIndicatorImageViews[mAdIndicatorImageViews.length - 1]

                       .setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;

            }else {

                Log.d(TAG, "setCurrentItem" + arg0);

                //mAdPager.setCurrentItem(arg0,false) ;

                mAdIndicatorImageViews[arg0 - 1]

                       .setBackgroundResource(R.drawable.music_handle_favorites_select_icon) ;

            }

        }

       

    }

   

    private final classAdvAdapter extends PagerAdapter {

        privateList<View> views = null ;

       

        publicAdvAdapter(List<View> views) {

            this.views = views ;

        }

       

        @Override

        public voiddestroyItem(View arg0, int arg1, Object arg2) {

            ((ViewPager) arg0).removeView(views.get(arg1)) ;

        }

       

        @Override

        public voidfinishUpdate(View arg0) {

           

        }

       

        @Override

        public intgetCount() {

            return views.size() ;

        }

       

        @Override

        public ObjectinstantiateItem(View arg0, int arg1) {

            Log.d(TAG, "instantiateItem:" + arg1);

            //((ViewPager)arg0).removeView(views.get(arg1)) ;

            ((ViewPager) arg0).addView(views.get(arg1), 0) ;

            return views.get(arg1) ;

        }

       

        @Override

        public booleanisViewFromObject(View arg0, Object arg1) {

            return arg0 == arg1 ;

        }

       

        @Override

        public voidrestoreState(Parcelable arg0, ClassLoader arg1) {

           

        }

       

        @Override

        publicParcelable saveState() {

            return null ;

        }

       

        @Override

        public voidstartUpdate(View arg0) {

           

        }

       

    }

 

 

Xml file

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical">

 

    <android.support.v4.view.ViewPager

        android:id="@+id/adv_pager"

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:layout_weight="2"

        android:background="@drawable/ad_migu1">

    </android.support.v4.view.ViewPager>

 

    <LinearLayout

        android:id="@+id/viewGroup"

        android:layout_width="fill_parent"

        android:layout_height="10dp"

        android:layout_marginTop="-10dp"

        android:gravity="center"

        android:orientation="horizontal">

    </LinearLayout>

 

    <GridView

        android:id="@id/chart_grid"

        android:layout_width="fill_parent"

        android:layout_height="0dp"

        android:layout_marginLeft="10dip"

        android:layout_marginRight="10dip"

        android:layout_weight="7"

        android:numColumns="2"/>

   

    <TextView

        android:id="@id/empty_view"

        android:layout_width="fill_parent"

        android:layout_height="match_parent"

        android:gravity="center"

        android:text="@string/text_empty_view"

        android:textColor="@color/list_view_empty_view_text_color"/>

 

</LinearLayout>


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值