简单轮播的实现

简单轮播的实现

1、适配器:BannerAdapter
public class BannerAdapter  extends PagerAdapter {

     private List<View>  viewList ;
    private int  size ;

    public  BannerAdapter(List<View> viewList) {
         this. viewList = viewList ;
         size = viewList.size() ;
    }

     @Override
     public void  destroyItem(ViewGroup container , int position Object object) {
        container.removeView( viewList.get(position% size)) ;
    }

     @Override
     public Object  instantiateItem(ViewGroup container , int position) {
        container.addView( viewList.get(position% size)) ;
        return  viewList.get(position% size) ;
    }

     @Override
     public int  getCount() {
         return Integer. MAX_VALUE ;
    }

     @Override
     public boolean  isViewFromObject(View view Object object) {
         return view == object ;
    }
}

2、BannerView
public class BannerView  extends FrameLayout {

     private static final int  MSG_LOOP 1000 ;
     // 间隔时间
     private static long  LOOP_INTERVAL 5000 ;
    private LinearLayout  mLinearPosition null;
    private ViewPager  mViewPager null;
    private BannerHandler  mBannerHandler null;

     // 真实显示的 banner view  集合
     private List<View>  viewList ;
     // 真实显示的 banner view 个数
     private int  viewSize ;

    private static class BannerHandler  extends Handler {
         private WeakReference<BannerView>  weakReference null;

        public  BannerHandler(BannerView bannerView) {
             super(Looper. getMainLooper()) ;
            this. weakReference new WeakReference<BannerView>(bannerView) ;
        }

         @Override
         public void  handleMessage(Message msg) {
             super.handleMessage(msg) ;
            if ( this. weakReference ==  null) {
                 return;
            }
            BannerView  bannerView this. weakReference.get() ;
            if ( bannerView ==  null ||  bannerView. mViewPager ==  null ||  bannerView. mViewPager.getAdapter() ==  null ||  bannerView. mViewPager.getAdapter().getCount() <=  0) {
                sendEmptyMessageDelayed( MSG_LOOP LOOP_INTERVAL) ;
                return;
            }
             int  curPos bannerView. mViewPager.getCurrentItem() ;
             curPos = ( curPos 1) %  bannerView. mViewPager.getAdapter().getCount() ;
             bannerView. mViewPager.setCurrentItem( curPos) ;
            sendEmptyMessageDelayed( MSG_LOOP LOOP_INTERVAL) ;
        }
    }

     public  BannerView(Context context) {
         super(context) ;
        init() ;
    }

     public  BannerView(Context context AttributeSet attrs) {
         super(context attrs) ;
        init() ;
    }

     public void  startLoop( boolean flag) {
         if (flag) {
             if ( mBannerHandler ==  null) {
                 mBannerHandler new BannerHandler( this) ;
            }
             mBannerHandler.sendEmptyMessageDelayed( MSG_LOOP LOOP_INTERVAL) ;
        else {
             if ( mBannerHandler !=  null) {
                 if ( mBannerHandler.hasMessages( MSG_LOOP)) {
                     mBannerHandler.removeMessages( MSG_LOOP) ;
                }
            }
        }
    }

     private void  init() {
        initViewPager() ;
        initLinearPosition() ;
        this.addView( mViewPager) ;
        this.addView( mLinearPosition) ;
    }

     private void  initViewPager() {
         mViewPager new ViewPager(getContext()) ;
        LayoutParams  layoutParams new LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT
                 ViewGroup.LayoutParams. WRAP_CONTENT) ;
         mViewPager.setLayoutParams( layoutParams) ;
         mViewPager.addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
             @Override
             public void  onPageScrolled( int position , float positionOffset , int positionOffsetPixels) {
                Log. d( "dagger" , "position :"+position+ "    positionOffset :"+positionOffset) ;
            }

             @Override
             public void  onPageSelected( int position) {
                Log. d( "dagger" , "onPageSelected :"+position) ;
                 updateLinearPosition() ;
            }

             @Override
             public void  onPageScrollStateChanged( int state) {

            }
        }) ;
         mViewPager.setOnTouchListener( new OnTouchListener() {
             @Override
             public boolean  onTouch(View v MotionEvent event) {
                 switch (event.getAction()){
                     case MotionEvent. ACTION_DOWN:
                         if ( mBannerHandler !=  null) {
                             if ( mBannerHandler.hasMessages( MSG_LOOP)) {
                                 mBannerHandler.removeMessages( MSG_LOOP) ;
                            }
                        }
                         break;
                    case MotionEvent. ACTION_UP:
                         if ( mBannerHandler !=  null) {
                             mBannerHandler.sendEmptyMessageDelayed( MSG_LOOP LOOP_INTERVAL) ;
                        }
                         break;
                    default:
                         break;
                }
                 return false;
            }
        }) ;
    }

     private void  initLinearPosition() {
         mLinearPosition new LinearLayout(getContext()) ;
         mLinearPosition.setOrientation(LinearLayout. HORIZONTAL) ;
        LayoutParams  layoutParams new LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT
                 ViewGroup.LayoutParams. WRAP_CONTENT) ;
         // 点在中间
         layoutParams. gravity = Gravity. CENTER_HORIZONTAL | Gravity. BOTTOM ;
         layoutParams. bottomMargin = getResources().getDimensionPixelSize(R.dimen. dimen_9dp) ;
         mLinearPosition.setPadding(getResources().getDimensionPixelSize(R.dimen. dimen_9dp) 0 0 0) ;
         mLinearPosition.setLayoutParams( layoutParams) ;
    }

     public void  setAdapter(PagerAdapter adapter) {
         mViewPager.setAdapter(adapter) ;
        adapter.registerDataSetObserver( mDataObserver) ;
        updateLinearPosition() ;
    }

     private DataSetObserver  mDataObserver new DataSetObserver() {
         @Override
         public void  onChanged() {
             super.onChanged() ;
            updateLinearPosition() ;
        }

         @Override
         public void  onInvalidated() {
             super.onInvalidated() ;
        }
    } ;

    private void  updateLinearPosition() {
         if ( viewList !=  null &&  viewList.size() !=  0) {
             if ( mLinearPosition.getChildCount() !=  viewSize) {
                 int  diffCnt mLinearPosition.getChildCount() -  viewSize ;
                boolean  needAdd diffCnt 0 ;
                 diffCnt = Math. abs( diffCnt) ;
                for ( int  0 diffCnt i++) {
                     if ( needAdd) {
                        ImageView  img new ImageView(getContext()) ;
                        LinearLayout.LayoutParams  layoutParams new LinearLayout.LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT ViewGroup.LayoutParams. WRAP_CONTENT) ;
                         layoutParams. rightMargin = getResources().getDimensionPixelOffset(R.dimen. dimen_9dp) ;
                         img.setLayoutParams( layoutParams) ;
                         img.setBackgroundResource(R.drawable. banner_point) ;
                         mLinearPosition.addView( img) ;
                    else {
                         mLinearPosition.removeViewAt( 0) ;
                    }
                }
            }
             int  curPos mViewPager.getCurrentItem() ;
            for ( int  0 mLinearPosition.getChildCount() i++) {
                 if ( == ( curPos viewSize)) {
                     mLinearPosition.getChildAt( i).setBackgroundResource(R.drawable. banner_point_select) ;
                else {
                     mLinearPosition.getChildAt( i).setBackgroundResource(R.drawable. banner_point) ;
                }
            }
        }
    }

     public void  setViewList(List<View> viewList) {
         this. viewList = viewList ;
        if (viewList !=  null && viewList.size() !=  0) {
             viewSize = viewList.size() ;
            BannerAdapter  bannerAdapter new BannerAdapter(viewList) ;
            setAdapter( bannerAdapter) ;
        }
    }

     public void  setTransformAnim ( boolean flag){
         if (flag){
             /**
             * 假设现在 ViewPager A 页现在滑出 B 页,则 :
              A 页的 position 变化就是 ( 0, -1]
              B 页的 position 变化就是 [ 1 , 0 ]
             */
             mViewPager.setPageTransformer( true, new ViewPager.PageTransformer() {
                 private static final float  MIN_SCALE 0.75f ;
                 @Override
                 public void  transformPage(View view , float position) {
                     int  pageWidth = view.getWidth() ;
                    if (position < - 1)
                    {  // [-Infinity,-1)
                        // This page is way off-screen to the left.
                        view.setRotation( 0) ;

                    else if (position <=  1// a 页滑动至 b 页 ;  a 页从  0.0 ~ -1  b 页从 1 ~ 0.0
                    // [-1,1]
                        // Modify the default slide transition to shrink the page as well
                         if (position <  0)
                        {

                             float  mRot = ( 20f * position) ;
                            view.setPivotX(view.getMeasuredWidth() *  0.5f) ;
                            view.setPivotY(view.getMeasuredHeight()) ;
                            view.setRotation( mRot) ;
                        else
                        {

                             float  mRot = ( 20f * position) ;
                            view.setPivotX(view.getMeasuredWidth() *  0.5f) ;
                            view.setPivotY(view.getMeasuredHeight()) ;
                            view.setRotation( mRot) ;
                        }

                         // Scale the page down (between MIN_SCALE and 1)

                        // Fade the page relative to its size.

                    else
                    // (1,+Infinity]
                        // This page is way off-screen to the right.
                        view.setRotation( 0) ;
                    }
                }
            }) ;
        }
    }

     public static void  setLoopInterval( long loopInterval) {
         LOOP_INTERVAL = loopInterval ;
    }

}

3、布局
<? xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout  xmlns: android = "http://schemas.android.com/apk/res/android"
     xmlns: tools = "http://schemas.android.com/tools"
     android :layout_width= "match_parent"
     android :layout_height= "match_parent"
     android :orientation= "vertical"
     tools :context= "com.blink.test.bannerview.MainActivity" >

    <com.blink.test.bannerview.BannerView
         android :layout_width= "match_parent"
         android :layout_height= "220dp"
         android :id= "@+id/banner" />
</LinearLayout>

4、实例展示
public class MainActivity  extends AppCompatActivity {

     private int[]  imgs = {R.drawable. a ,R.drawable. b ,R.drawable. c ,R.drawable. d} ;
    private List<View>  viewList ;
    BannerView  bannerView ;

     @Override
     protected void  onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState) ;
        setContentView(R.layout. activity_main) ;
         viewList new ArrayList<View>() ;
        for ( int  0 imgs. length i++) {
            ImageView  image new ImageView( this) ;
             image.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams. MATCH_PARENT ViewGroup.LayoutParams. MATCH_PARENT)) ;
             // 设置显示格式
             image.setScaleType(ImageView.ScaleType. CENTER_CROP) ;
             image.setImageResource( imgs[ i]) ;
             viewList.add( image) ;
        }
         bannerView = (BannerView) findViewById(R.id. banner) ;
         bannerView.setViewList( viewList) ;
         bannerView.startLoop( true) ;
//        bannerView.setTransformAnim(true);

    }
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值