自定义轮播图加小圆点

布局文件引用

<?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="wrap_content">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="150dp">

        <androidx.viewpager.widget.ViewPager
            android:id="@+id/bannerViewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:clipToPadding="false"
            android:paddingLeft="9dp"
            android:paddingRight="9dp"></androidx.viewpager.widget.ViewPager>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/bannerRecycleView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="9dp"></androidx.recyclerview.widget.RecyclerView>
    </RelativeLayout>

</LinearLayout>

Activity调用

 ViewPager bannerViewPager = view.findViewById(R.id.bannerViewPager);
 RecyclerView bannerRecycleView = view.findViewById(R.id.bannerRecycleView);

 List<String> bannerList = new ArrayList<>();
      
new BannerView().setBanner(getActivity(), bannerViewPager, bannerRecycleView, bannerList,     new BannerView.OnClickListener() {
            @Override
            public void cickPostion(int position) {

            }
     });

Banner管理器

package com.xinchengle.xiaokedou.utils.uiutils;

import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.widget.LinearLayout;
import android.widget.Scroller;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import com.bumptech.glide.Glide;
import com.xinchengle.xiaokedou.R;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Banner 轮播图
 */

public class BannerView {

    public interface OnClickListener {
        void cickPostion(int position);
    }

    private Context context;
    private List<String> list;
    private OnClickListener onClickListener;
    private ViewPager viewPager;
    private final int BANNER_NEXT = 1;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case BANNER_NEXT:
                    int currentItem = viewPager.getCurrentItem();
                    viewPager.setCurrentItem(currentItem + 1);
                    sendMsg();
                    break;
            }
        }
    };

    public void setBanner(Context context, ViewPager vp, RecyclerView recyclerView, List<String> list, BannerView.OnClickListener onClickListener) {
        this.context = context;
        this.list = list;
        this.onClickListener = onClickListener;
        this.viewPager = vp;

        if (list.size() == 0) {
            return;
        }

        //设置展示View
        recyclerView.setLayoutManager(new LinearLayoutManager(context, RecyclerView.HORIZONTAL, false));
        MyDotAdapter myDotAdaoter = new MyDotAdapter();
        recyclerView.setAdapter(myDotAdaoter);

        ViewPagerScroller pagerScroller = new ViewPagerScroller(context);
        pagerScroller.initViewPagerScroll(viewPager);

        MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter();
        viewPager.setAdapter(myViewPagerAdapter);

        //让viewpager的索引默认的指在200
        viewPager.setCurrentItem(200);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                myDotAdaoter.setCheckPostion(position);
                myDotAdaoter.notifyDataSetChanged();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        //及时取消viewPager切换事件  防止OOM
        viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:  //按下
                        handler.removeMessages(BANNER_NEXT);

                    case MotionEvent.ACTION_MOVE:  //移动
                        handler.removeMessages(BANNER_NEXT);

                    case MotionEvent.ACTION_UP:  //抬起
                        handler.removeMessages(BANNER_NEXT);
                        handler.sendEmptyMessageDelayed(BANNER_NEXT, 3000);
                }
                return false;
            }
        });

    }

    //发送轮播请求
    private void sendMsg() {
        handler.sendEmptyMessageDelayed(BANNER_NEXT, 3000);
    }

    //ViewPager适配器
    private class MyViewPagerAdapter extends PagerAdapter {

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

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

        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            container.removeView((View) object);
        }

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {

            View inflate = View.inflate(context, R.layout.item_banner_vp_view, null);
            RoundImageView imageView = inflate.findViewById(R.id.roundImage);
            if (!isDestroy((Activity) context)) {
                Glide.with(context).load(list.get(position % list.size())).into(imageView);
            }
            container.addView(inflate);
            inflate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(onClickListener!=null){
                        onClickListener.cickPostion(position % list.size());
                    }
                }
            });

            return inflate;
        }
    }

    /**
     * 判断Activity是否Destroy
     */
    private static boolean isDestroy(Activity mActivity) {
        if (mActivity == null || mActivity.isFinishing() || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && mActivity.isDestroyed())) {
            return true;
        } else {
            return false;
        }
    }

    //小圆点适配器
    private class MyDotAdapter extends RecyclerView.Adapter<MyDotAdapter.ViewHolder> {

        private int checkPostion;

        public void setCheckPostion(int checkPostion) {
            this.checkPostion = checkPostion;
        }

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View inflate = View.inflate(context, R.layout.item_banner_recycle_view, null);
            return new ViewHolder(inflate);
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            if (position == (checkPostion % list.size())) {
                holder.bannerDot.setBackgroundResource(R.drawable.shape_banner_dot_check);
            } else {
                holder.bannerDot.setBackgroundResource(R.drawable.shape_banner_dot_false);
            }
        }

        @Override
        public int getItemCount() {
            return list.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder {

            private final LinearLayout bannerDot;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                bannerDot = itemView.findViewById(R.id.bannerDot);
            }
        }
    }

    //配置滑动速度
    private class ViewPagerScroller extends Scroller {

        private int mScrollDuration = 800;

        public ViewPagerScroller(Context context) {
            super(context);
        }

        public ViewPagerScroller(Context context, Interpolator interpolator) {
            super(context, interpolator);
        }

        public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) {
            super(context, interpolator, flywheel);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy) {
            super.startScroll(startX, startY, dx, dy, mScrollDuration);
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, mScrollDuration);
        }

        public void initViewPagerScroll(ViewPager viewPager) {
            try {
                Field mScroller = ViewPager.class.getDeclaredField("mScroller");
                mScroller.setAccessible(true);
                mScroller.set(viewPager, this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

小圆点选择shape

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

    <!-- 表示shape的四个角的角度。只适用于矩形shape,这里的角度是指圆角的程度 -->
    <corners
        android:topLeftRadius="180dp"
        android:topRightRadius="180dp"
        android:bottomLeftRadius="180dp"
        android:bottomRightRadius="180dp"
        />

    <!-- 这个标签表示纯色填充,通过android:color即可指定shape中填充的颜色 -->
    <solid android:color="@color/color_them_app" />

</shape>

小圆点未选择shape

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

    <!-- 表示shape的四个角的角度。只适用于矩形shape,这里的角度是指圆角的程度 -->
    <corners
        android:topLeftRadius="180dp"
        android:topRightRadius="180dp"
        android:bottomLeftRadius="180dp"
        android:bottomRightRadius="180dp"
        />

    <!-- 这个标签表示纯色填充,通过android:color即可指定shape中填充的颜色 -->
    <solid android:color="@color/color_line" />

</shape>

ViewPager引用布局(其实就是引用个ImageView,我这是圆角)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.xinchengle.xiaokedou.utils.uiutils.RoundImageView
        android:layout_marginLeft="2dp"
        android:layout_marginRight="2dp"
        android:id="@+id/roundImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:borderRadius="12dp"
        app:type="round" />

</RelativeLayout>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值