自定义一个Banner用用(基于ViewPager)

  1.  自定义Banner继承RelativeLayout
    public class Banner extends RelativeLayout implements ViewPager.OnPageChangeListener {
    
       
        RelativeLayout container;
        ViewPager pager;
        LinearLayout points;
    
        private int duration, currentIndex;
    
        private List<ImageView> indicators = new ArrayList<>();
    
        public Banner(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            View view= inflate(context, R.layout.common_view_banner, this);
            container = view.findViewById(R.id.common_view_banner_container);
            pager= view.findViewById(R.id.common_view_banner_pager);
            points= view.findViewById(R.id.common_view_banner_points);
    
            //获取自定义的属性
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.Banner);
            duration = array.getInt(R.styleable.Banner_banner_duration, 3000);//间隔
            ViewGroup.LayoutParams layoutParams = container.getLayoutParams();
            layoutParams.height = DimensUtil.dip2px(array.getInt(R.styleable.Banner_banner_height, 160));//高度
            container.setLayoutParams(layoutParams);
            setClickable(true);
            array.recycle();
            FixedSpeedScroller.setViewPagerDuration(pager, 100);
        }
    
        @Override
        public void onPageScrolled(int i, float v, int i1) {
        }
    
        @Override
        public void onPageSelected(int i) {
            currentIndex = i;
            for (ImageView indicator : indicators) indicator.setPressed(false);
            indicators.get(currentIndex % indicators.size()).setPressed(true);
        }
    
        @Override
        public void onPageScrollStateChanged(int i) {
            switch (i) {
                case ViewPager.SCROLL_STATE_IDLE:
                    //完全空闲状态
                    start();
                    break;
                default:
                    stop();
                    break;
            }
        }
    
        //用的Fastjson
        public void initData(JSONArray array) {
            if (array == null || array.size() == 0) {
                throw new IllegalArgumentException("传入参数不能为空");
            }
    
            LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            params.setMargins(10, 10, 10, 10);
            for (int i = 0; i < array.size(); i++) {
                ImageView indicator = new ImageView(ContextHolder.context);
                indicator.setImageResource(R.drawable.common_indicator_point);
                indicator.setLayoutParams(params);
                indicator.setPressed(i == 0);
                points.addView(indicator);
                indicators.add(indicator);
            }
            pager.setAdapter(new BannerPagerAdapter(array));
            pager.setPageTransformer(true, new GalleryTransformer());
            pager.addOnPageChangeListener(this);
        }
    
        public void start() {
            handler.sendEmptyMessageDelayed(0, duration);
        }
    
        public void stop() {
            handler.removeMessages(0);
        }
    
        private Handler handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                pager.setCurrentItem(currentIndex + 1, true);
                handler.sendEmptyMessageDelayed(0, duration);
                return false;
            }
        });
    }
    

     

  2.  banner的布局

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/common_view_banner_container"
        android:layout_width="match_parent"
        android:layout_height="@dimen/common_banner_height"
        android:background="@color/common_white">
    
        <android.support.v4.view.ViewPager
            android:id="@+id/common_view_banner_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <LinearLayout
            android:id="@+id/common_view_banner_points"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:orientation="horizontal"
            android:padding="@dimen/common_padding_5" />
    </RelativeLayout>

     

  3. styleable文件

    <declare-styleable name="Banner" tools:ignore="ResourceName">
            <attr name="banner_duration" format="integer" />
            <attr name="banner_height" format="integer" />
        </declare-styleable>

     

  4. ViewPager的差值修改

    public class FixedSpeedScroller extends Scroller {
    
        private int duration = 500;
    
        public FixedSpeedScroller(Context context, Interpolator interpolator) {
            super(context, interpolator);
        }
    
        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, this.duration);
        }
    
        @Override
        public void startScroll(int startX, int startY, int dx, int dy) {
            super.startScroll(startX, startY, dx, dy, duration);
        }
    
        public void setDuration(int duration) {
            this.duration = duration;
        }
    
        public static void setViewPagerDuration(ViewPager pager, int duration) {
            try {
                Field field = ViewPager.class.getDeclaredField("mScroller");
                field.setAccessible(true);
                FixedSpeedScroller scroller = new FixedSpeedScroller(pager.getContext(), new AccelerateInterpolator());
                scroller.setDuration(300);
                field.set(pager, scroller);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

     

     

     

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值